{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9b088054-daa2-4dbe-a71c-3a3dd58ab3b5",
   "metadata": {},
   "source": [
    "# Part 1: Setting up a basic semantic search system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aGixSoAgIzLo",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "aGixSoAgIzLo",
    "outputId": "cfcad5a5-3d39-4b79-a0ef-c33107ad1972"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Successfully installed datasets-2.18.0 dill-0.3.8 h11-0.14.0 httpcore-1.0.5 httpx-0.27.0 multiprocess-0.70.16 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.19.3 nvidia-nvjitlink-cu12-12.4.127 nvidia-nvtx-cu12-12.1.105 openai-1.17.0 pinecone-client-3.2.2 sentence-transformers-2.6.1 tiktoken-0.6.0 xxhash-3.4.1\n"
     ]
    }
   ],
   "source": [
    "!pip install pinecone-client openai sentence-transformers tiktoken datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c12182ab",
   "metadata": {
    "id": "c12182ab"
   },
   "outputs": [],
   "source": [
    "from openai import OpenAI\n",
    "from datetime import datetime\n",
    "import hashlib\n",
    "import re\n",
    "import os\n",
    "from sentence_transformers import CrossEncoder\n",
    "\n",
    "\n",
    "from tqdm import tqdm\n",
    "import numpy as np\n",
    "from torch import nn\n",
    "\n",
    "import logging\n",
    "from pinecone import Pinecone, ServerlessSpec\n",
    "\n",
    "logger = logging.getLogger()\n",
    "logger.setLevel(logging.CRITICAL)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f0289c54",
   "metadata": {
    "id": "f0289c54"
   },
   "outputs": [],
   "source": [
    "pinecone_key = os.environ.get('PINECONE_API_KEY')\n",
    "client = OpenAI(\n",
    "    api_key=os.environ.get(\"OPENAI_API_KEY\")\n",
    ")\n",
    "\n",
    "INDEX_NAME = 'semantic-search-test'\n",
    "NAMESPACE = 'default'\n",
    "ENGINE = 'text-embedding-3-large'  # has vector size 3072\n",
    "\n",
    "pc = Pinecone(\n",
    "    api_key=pinecone_key\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "3cf993a3-6d51-49f4-8968-60f654d6202d",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "3cf993a3-6d51-49f4-8968-60f654d6202d",
    "outputId": "12a29199-9a84-4855-f07f-7979b15a718b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3072, 2)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# helper functions to get lists of embeddings from the OpenAI API\n",
    "def get_embeddings(texts, engine=ENGINE):\n",
    "    response = client.embeddings.create(\n",
    "        input=texts,\n",
    "        model=engine\n",
    "    )\n",
    "\n",
    "    return [d.embedding for d in list(response.data)]\n",
    "\n",
    "def get_embedding(text, engine=ENGINE):\n",
    "    return get_embeddings([text], engine)[0]\n",
    "\n",
    "len(get_embedding('hi')), len(get_embeddings(['hi', 'hello']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ea70672a",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ea70672a",
    "outputId": "7ba237ca-f93f-4a8b-83a1-5133a33b3080"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Creating index semantic-search-test\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<pinecone.data.index.Index at 0x781302d49c90>"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "if INDEX_NAME not in pc.list_indexes().names():\n",
    "    print(f'Creating index {INDEX_NAME}')\n",
    "    pc.create_index(\n",
    "        name=INDEX_NAME,  # The name of the index\n",
    "        dimension=3072,  # The dimensionality of the vectors for our OpenAI embedder\n",
    "        metric='cosine',  # The similarity metric to use when searching the index\n",
    "        spec=ServerlessSpec(\n",
    "            cloud='aws',\n",
    "            region='us-west-2'\n",
    "        )\n",
    "    )\n",
    "\n",
    "# Store the index as a variable\n",
    "index = pc.Index(name=INDEX_NAME)\n",
    "index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b6103d6c",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "b6103d6c",
    "outputId": "549365a0-a4ee-4dff-b20e-8d2e07c97e13"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'dimension': 3072,\n",
       " 'index_fullness': 0.0,\n",
       " 'namespaces': {},\n",
       " 'total_vector_count': 0}"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "index.describe_index_stats()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7f2fdfe7",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "7f2fdfe7",
    "outputId": "4c41491f-5ce8-415e-f792-e149e470b267"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'ae76cc4dfd345ecaeea9b8ba0d5c3437'"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def my_hash(s):\n",
    "    # Return the MD5 hash of the input string as a hexadecimal string\n",
    "    return hashlib.md5(s.encode()).hexdigest()\n",
    "\n",
    "my_hash('I love to hash it')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "ecd86f51",
   "metadata": {
    "id": "ecd86f51"
   },
   "outputs": [],
   "source": [
    "def prepare_for_pinecone(texts, engine=ENGINE):\n",
    "    # Get the current UTC date and time\n",
    "    now = datetime.utcnow()\n",
    "\n",
    "    # Generate vector embeddings for each string in the input list, using the specified engine\n",
    "    embeddings = get_embeddings(texts, engine=engine)\n",
    "\n",
    "    # Create tuples of (hash, embedding, metadata) for each input string and its corresponding vector embedding\n",
    "    # The my_hash() function is used to generate a unique hash for each string, and the datetime.utcnow() function is used to generate the current UTC date and time\n",
    "    return [\n",
    "        (\n",
    "            my_hash(text),  # A unique ID for each string, generated using the my_hash() function\n",
    "            embedding,  # The vector embedding of the string\n",
    "            dict(text=text, date_uploaded=now)  # A dictionary of metadata, including the original text and the current UTC date and time\n",
    "        )\n",
    "        for text, embedding in zip(texts, embeddings)  # Iterate over each input string and its corresponding vector embedding\n",
    "    ]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "4c40d99a",
   "metadata": {
    "id": "4c40d99a"
   },
   "outputs": [],
   "source": [
    "texts = ['hi']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3e1b73f3",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "3e1b73f3",
    "outputId": "eeba3b54-c2e5-481c-f340-3e3802c79b38"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ID:   49f68a5c8493ec2c0bf489821c21fc3b \n",
      "LEN:  3072 \n",
      "META: {'text': 'hi', 'date_uploaded': datetime.datetime(2024, 7, 1, 16, 33, 16, 847362)}\n"
     ]
    }
   ],
   "source": [
    "_id, embedding, metadata = prepare_for_pinecone(texts)[0]\n",
    "\n",
    "print('ID:  ',_id, '\\nLEN: ', len(embedding), '\\nMETA:', metadata)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b49debd5",
   "metadata": {
    "id": "b49debd5"
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "bf47aabd",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "bf47aabd",
    "outputId": "0cdc3643-d204-4d4f-9ed4-3f632a4328fb"
   },
   "outputs": [],
   "source": [
    "def upload_texts_to_pinecone(texts, namespace=NAMESPACE, batch_size=None, show_progress_bar=False):\n",
    "    # Call the prepare_for_pinecone function to prepare the input texts for indexing\n",
    "    total_upserted = 0\n",
    "    if not batch_size:\n",
    "        batch_size = len(texts)\n",
    "\n",
    "    _range = range(0, len(texts), batch_size)\n",
    "    for i in tqdm(_range) if show_progress_bar else _range:\n",
    "        batch = texts[i: i + batch_size]\n",
    "        prepared_texts = prepare_for_pinecone(batch)\n",
    "\n",
    "        # Use the upsert() method of the index object to upload the prepared texts to Pinecone\n",
    "        total_upserted += index.upsert(\n",
    "            vectors=prepared_texts,\n",
    "            namespace=namespace\n",
    "        )['upserted_count']\n",
    "\n",
    "\n",
    "    return total_upserted\n",
    "\n",
    "# Call the upload_texts_to_pinecone() function with the input texts\n",
    "upload_texts_to_pinecone(texts)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "V0XI6RAom-Ln",
   "metadata": {
    "id": "V0XI6RAom-Ln"
   },
   "outputs": [],
   "source": [
    "def query_from_pinecone(query, top_k=3, include_metadata=True):\n",
    "    # get embedding from THE SAME embedder as the documents\n",
    "    query_embedding = get_embedding(query, engine=ENGINE)\n",
    "\n",
    "    return index.query(\n",
    "      vector=query_embedding,\n",
    "      top_k=top_k,\n",
    "      namespace=NAMESPACE,\n",
    "      include_metadata=include_metadata   # gets the metadata (dates, text, etc)\n",
    "    ).get('matches')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "84a0871f",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "84a0871f",
    "outputId": "cf32ed08-348f-4be0-a647-cf0546ca0c2d"
   },
   "outputs": [],
   "source": [
    "def delete_texts_from_pinecone(texts, namespace=NAMESPACE):\n",
    "    # Compute the hash (id) for each text\n",
    "    hashes = [hashlib.md5(text.encode()).hexdigest() for text in texts]\n",
    "\n",
    "    # The ids parameter is used to specify the list of IDs (hashes) to delete\n",
    "    return index.delete(ids=hashes, namespace=namespace)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a6a5172f-a0c6-4692-ab77-83321e141679",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4523cab6-0bc3-4791-9c73-7bd7d7e5858b",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "4523cab6-0bc3-4791-9c73-7bd7d7e5858b",
    "outputId": "768dff70-122a-458d-b26b-ef915dee80e5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatasetDict({\n",
       "    test: Dataset({\n",
       "        features: ['id', 'title', 'context', 'question', 'answers'],\n",
       "        num_rows: 1148\n",
       "    })\n",
       "    train: Dataset({\n",
       "        features: ['id', 'title', 'context', 'question', 'answers'],\n",
       "        num_rows: 11590\n",
       "    })\n",
       "})"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from datasets import load_dataset\n",
    "\n",
    "dataset = load_dataset(\"xtreme\", \"MLQA.en.en\")\n",
    "\n",
    "# rename test -> train and val -> test (as we will use it in later in this chapter)\n",
    "dataset['train'] = dataset['test']\n",
    "dataset['test'] = dataset['validation']\n",
    "del dataset['validation']\n",
    "\n",
    "dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e622fbfa-2dde-4711-9c46-1390eb3430f9",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "e622fbfa-2dde-4711-9c46-1390eb3430f9",
    "outputId": "8e7d6133-76ce-493a-963f-f29e05c6e0ba"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "({'id': 'a4968ca8a18de16aa3859be760e43dbd3af3fce9',\n",
       "  'title': 'Area 51',\n",
       "  'context': 'In 1994, five unnamed civilian contractors and the widows of contractors Walter Kasza and Robert Frost sued the USAF and the United States Environmental Protection Agency. Their suit, in which they were represented by George Washington University law professor Jonathan Turley, alleged they had been present when large quantities of unknown chemicals had been burned in open pits and trenches at Groom. Biopsies taken from the complainants were analyzed by Rutgers University biochemists, who found high levels of dioxin, dibenzofuran, and trichloroethylene in their body fat. The complainants alleged they had sustained skin, liver, and respiratory injuries due to their work at Groom, and that this had contributed to the deaths of Frost and Kasza. The suit sought compensation for the injuries they had sustained, claiming the USAF had illegally handled toxic materials, and that the EPA had failed in its duty to enforce the Resource Conservation and Recovery Act (which governs handling of dangerous materials). They also sought detailed information about the chemicals to which they were allegedly exposed, hoping this would facilitate the medical treatment of survivors. Congressman Lee H. Hamilton, former chairman of the House Intelligence Committee, told 60 Minutes reporter Lesley Stahl, \"The Air Force is classifying all information about Area 51 in order to protect themselves from a lawsuit.\"',\n",
       "  'question': 'Who analyzed the biopsies?',\n",
       "  'answers': {'answer_start': [457],\n",
       "   'text': ['Rutgers University biochemists']}},\n",
       " {'id': 'f251ea56c4f1aa1df270137f7e6d89c0cc1b6ef4',\n",
       "  'title': 'Area 51',\n",
       "  'context': 'In 1994, five unnamed civilian contractors and the widows of contractors Walter Kasza and Robert Frost sued the USAF and the United States Environmental Protection Agency. Their suit, in which they were represented by George Washington University law professor Jonathan Turley, alleged they had been present when large quantities of unknown chemicals had been burned in open pits and trenches at Groom. Biopsies taken from the complainants were analyzed by Rutgers University biochemists, who found high levels of dioxin, dibenzofuran, and trichloroethylene in their body fat. The complainants alleged they had sustained skin, liver, and respiratory injuries due to their work at Groom, and that this had contributed to the deaths of Frost and Kasza. The suit sought compensation for the injuries they had sustained, claiming the USAF had illegally handled toxic materials, and that the EPA had failed in its duty to enforce the Resource Conservation and Recovery Act (which governs handling of dangerous materials). They also sought detailed information about the chemicals to which they were allegedly exposed, hoping this would facilitate the medical treatment of survivors. Congressman Lee H. Hamilton, former chairman of the House Intelligence Committee, told 60 Minutes reporter Lesley Stahl, \"The Air Force is classifying all information about Area 51 in order to protect themselves from a lawsuit.\"',\n",
       "  'question': 'who represented robert frost and walter kasza in their suit?',\n",
       "  'answers': {'answer_start': [218],\n",
       "   'text': ['George Washington University law professor Jonathan Turley']}})"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset['train'][0], dataset['train'][1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0221343a",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "0221343a",
    "outputId": "5ab7c522-23ea-467c-be72-fe031432fbdc"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 31/31 [01:28<00:00,  2.87s/it]\n"
     ]
    }
   ],
   "source": [
    "unique_passages = list(set(dataset['test']['context']))\n",
    "for idx in tqdm(range(0, len(unique_passages), 32)):\n",
    "    passages = unique_passages[idx:idx + 32]\n",
    "    upload_texts_to_pinecone(passages)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "796a7c80-7149-430e-b22c-9926c0d1daee",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "796a7c80-7149-430e-b22c-9926c0d1daee",
    "outputId": "5fc883f2-230a-4fbf-d186-a60f5dd3573a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "978"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(unique_passages)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "33yf7QrWtwt-",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "33yf7QrWtwt-",
    "outputId": "9e8d30a5-b1b3-43f7-ad6d-bec8135fc5ee"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'dimension': 3072,\n",
       " 'index_fullness': 0.0,\n",
       " 'namespaces': {'default': {'vector_count': 978}},\n",
       " 'total_vector_count': 978}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "index.describe_index_stats()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "432b021b-2cdb-4d73-a2c6-f2e0d1eb5ffc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'id': '569666f4dc3983dab5624e989212c1d9d0cd1798',\n",
       " 'title': 'Pappataci fever',\n",
       " 'context': 'Pappataci fever is prevalent in the subtropical zone of the Eastern Hemisphere between 20°N and 45°N, particularly in Southern Europe, North Africa, the Balkans, Eastern Mediterranean, Iraq, Iran, Pakistan, Afghanistan and India.The disease is transmitted by the bites of phlebotomine sandflies of the Genus Phlebotomus, in particular, Phlebotomus papatasi, Phlebotomus perniciosus and Phlebotomus perfiliewi. The sandfly becomes infected when biting an infected human in the period between 48 hours before the onset of fever and 24 hours after the end of the fever, and remains infected for its lifetime. Besides this horizontal virus transmission from man to sandfly, the virus can be transmitted in insects transovarially, from an infected female sandfly to its offspring.Pappataci fever is seldom recognised in endemic populations because it is mixed with other febrile illnesses of childhood, but it is more well-known among immigrants and military personnel from non-endemic regions.',\n",
       " 'question': 'Does an infection for Sandflies go away over time?',\n",
       " 'answers': {'answer_start': [571],\n",
       "  'text': ['remains infected for its lifetime']}}"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset['test'][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "36e13316-2295-4a72-8f2a-b459f0e7826a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'id': '2f90090e21f19450887d5f3ff781e541',\n",
       "  'metadata': {'date_uploaded': '2024-02-04T15:47:20.914703',\n",
       "               'text': 'Pappataci fever is prevalent in the subtropical zone of '\n",
       "                       'the Eastern Hemisphere between 20°N and 45°N, '\n",
       "                       'particularly in Southern Europe, North Africa, the '\n",
       "                       'Balkans, Eastern Mediterranean, Iraq, Iran, Pakistan, '\n",
       "                       'Afghanistan and India.The disease is transmitted by the '\n",
       "                       'bites of phlebotomine sandflies of the Genus '\n",
       "                       'Phlebotomus, in particular, Phlebotomus papatasi, '\n",
       "                       'Phlebotomus perniciosus and Phlebotomus perfiliewi. The '\n",
       "                       'sandfly becomes infected when biting an infected human '\n",
       "                       'in the period between 48 hours before the onset of '\n",
       "                       'fever and 24 hours after the end of the fever, and '\n",
       "                       'remains infected for its lifetime. Besides this '\n",
       "                       'horizontal virus transmission from man to sandfly, the '\n",
       "                       'virus can be transmitted in insects transovarially, '\n",
       "                       'from an infected female sandfly to its '\n",
       "                       'offspring.Pappataci fever is seldom recognised in '\n",
       "                       'endemic populations because it is mixed with other '\n",
       "                       'febrile illnesses of childhood, but it is more '\n",
       "                       'well-known among immigrants and military personnel from '\n",
       "                       'non-endemic regions.'},\n",
       "  'score': 0.436064631,\n",
       "  'values': []},\n",
       " {'id': '00661b04eb84a4664717245513ea30cd',\n",
       "  'metadata': {'date_uploaded': '2024-02-04T15:46:50.126453',\n",
       "               'text': 'Paratyphoid fever, also known simply as paratyphoid, is '\n",
       "                       'a bacterial infection caused by one of the three types '\n",
       "                       'of Salmonella enterica. Symptoms usually begin 6–30 '\n",
       "                       'days after exposure and are the same as those of '\n",
       "                       'typhoid fever. Often, a gradual onset of a high fever '\n",
       "                       'occurs over several days. Weakness, loss of appetite, '\n",
       "                       'and headaches also commonly occur. Some people develop '\n",
       "                       'a skin rash with rose-colored spots. Without treatment, '\n",
       "                       'symptoms may last weeks or months. Other people may '\n",
       "                       'carry the bacteria without being affected; however, '\n",
       "                       'they are still able to spread the disease to others. '\n",
       "                       'Both typhoid and paratyphoid are of similar severity. '\n",
       "                       'Paratyphoid and typhoid fever are types of enteric '\n",
       "                       'fever.Paratyphoid is caused by the bacterium Salmonella '\n",
       "                       'enterica of the serotypes Paratyphi A, Paratyphi B, or '\n",
       "                       'Paratyphi C growing in the intestines and blood. They '\n",
       "                       'are usually spread by eating or drinking food or water '\n",
       "                       'contaminated with the feces of an infected person. They '\n",
       "                       'may occur when a person who prepares food is infected. '\n",
       "                       'Risk factors include poor sanitation as is found among '\n",
       "                       'poor crowded populations. Occasionally, they may be '\n",
       "                       'transmitted by sex. Humans are the only animals '\n",
       "                       'infected. Diagnosis may be based on symptoms and '\n",
       "                       'confirmed by either culturing the bacteria or detecting '\n",
       "                       'the bacterial DNA in the blood, stool, or bone marrow. '\n",
       "                       'Culturing the bacteria can be difficult. Bone-marrow '\n",
       "                       'testing is the most accurate. Symptoms are similar to '\n",
       "                       'that of many other infectious diseases. Typhus is an '\n",
       "                       'unrelated disease.While no vaccine is available '\n",
       "                       'specifically for paratyphoid, the typhoid vaccine may '\n",
       "                       'provide some benefit. Prevention includes drinking '\n",
       "                       'clean water, better sanitation, and better handwashing. '\n",
       "                       'Treatment of the disease is with antibiotics such as '\n",
       "                       'azithromycin. Resistance to a number of other '\n",
       "                       'previously effective antibiotics is common.Paratyphoid '\n",
       "                       'affects about six million people a year. It is most '\n",
       "                       'common in parts of Asia and rare in the developed '\n",
       "                       'world. Most cases are due to Paratyphi A rather than '\n",
       "                       'Paratyphi B or C. In 2015, paratyphoid fever resulted '\n",
       "                       'in about 29,200 deaths, down from 63,000 deaths in '\n",
       "                       '1990. The risk of death is between 10 and 15% without '\n",
       "                       'treatment, while with treatment, it may be less than '\n",
       "                       '1%.'},\n",
       "  'score': 0.325077146,\n",
       "  'values': []},\n",
       " {'id': '24d322a7ce10e9e2fa12fcf54f50c651',\n",
       "  'metadata': {'date_uploaded': '2024-02-04T15:47:04.001270',\n",
       "               'text': 'Although Aronson isolated this mycobacterium in 1926 '\n",
       "                       'from a fish, it was not until 1951 that it was found to '\n",
       "                       'be the cause of human disease by Linell and Norden. '\n",
       "                       'Large outbreaks of infection due to this atypical '\n",
       "                       'mycobacterium have been described in association with '\n",
       "                       'swimming. Infections related to swimming pools have now '\n",
       "                       'drastically fallen due to the improvements in the '\n",
       "                       'construction and maintenance of these facilities.The '\n",
       "                       'first case of M. marinum infection associated with a '\n",
       "                       \"fish-tank ('fish-tank granuloma') was reported in 1962 \"\n",
       "                       'by Swift and Cohen. M. marinum infection may be an '\n",
       "                       'occupational hazard for certain professions such as pet '\n",
       "                       'shop workers, but most infections occur in fish '\n",
       "                       'fanciers who keep an aquarium at home. Although '\n",
       "                       'infection may be caused by direct injury from the fish '\n",
       "                       'fins or bites, most are acquired during the handling of '\n",
       "                       'the aquariums such as cleaning or changing the water. '\n",
       "                       'Indirect infection has also been described related to a '\n",
       "                       'child’s bathing utensils that had been used to clean a '\n",
       "                       'fish tank. Due to an increased awareness of the disease '\n",
       "                       'and improved isolation methods, more and more cases are '\n",
       "                       'being recognized and reported worldwide.'},\n",
       "  'score': 0.301440448,\n",
       "  'values': []}]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "query_from_pinecone('Does an infection for Sandflies go away over time?')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5b92699e-2d92-4083-9508-ae47355c9c1a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "206ab80e-f4b4-48d2-8aef-b522024f6658",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "7e180a25-37e4-47a8-8ae8-a49f39c106ab",
   "metadata": {},
   "source": [
    "# Part 2: Making results more relevant with a cross-encoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "074fab6f",
   "metadata": {
    "id": "074fab6f"
   },
   "outputs": [],
   "source": [
    "# if you didn't import before\n",
    "\n",
    "from sentence_transformers.cross_encoder import CrossEncoder\n",
    "import numpy as np\n",
    "from torch import nn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "414fc2d5",
   "metadata": {
    "id": "414fc2d5"
   },
   "outputs": [],
   "source": [
    "from copy import copy\n",
    "\n",
    "def get_results_from_pinecone(query, top_k=3, re_rank_model=None, verbose=True, correct_hash=None):\n",
    "    results_from_pinecone = query_from_pinecone(query, top_k=top_k)\n",
    "    if not results_from_pinecone:\n",
    "        return []\n",
    "    if verbose:\n",
    "        print(\"Query:\", query)\n",
    "    final_results = []\n",
    "\n",
    "    retrieved_correct_position, reranked_correct_position = None, None\n",
    "    for idx, result_from_pinecone in enumerate(results_from_pinecone):\n",
    "        if correct_hash and result_from_pinecone['id'] == correct_hash:\n",
    "            retrieved_correct_position = idx\n",
    "\n",
    "    if re_rank_model is not None:\n",
    "        if verbose:\n",
    "            print('Document ID (Hash)\\t\\tRetrieval Score\\tCE Score\\tText')\n",
    "\n",
    "        sentence_combinations = [[query, result_from_pinecone['metadata']['text']] for result_from_pinecone in results_from_pinecone]\n",
    "\n",
    "        # Compute the similarity scores for these combinations\n",
    "        similarity_scores = re_rank_model.predict(sentence_combinations, activation_fct=nn.Sigmoid())\n",
    "\n",
    "        # Sort the scores in decreasing order\n",
    "        sim_scores_argsort = list(reversed(np.argsort(similarity_scores)))\n",
    "        sim_scores_sort = list(reversed(np.sort(similarity_scores)))\n",
    "        top_re_rank_score = sim_scores_sort[0]\n",
    "\n",
    "        # Print the scores\n",
    "        for idx in sim_scores_argsort:\n",
    "            result_from_pinecone = results_from_pinecone[idx]\n",
    "            if correct_hash and result_from_pinecone['id'] == correct_hash:\n",
    "                reranked_correct_position = idx\n",
    "            final_results.append({'score': similarity_scores[idx], 'id': result_from_pinecone['id'], 'metadata': result_from_pinecone['metadata']})\n",
    "            if verbose:\n",
    "                print(f\"{result_from_pinecone['id']}\\t{result_from_pinecone['score']:.2f}\\t{similarity_scores[idx]:.6f}\\t{result_from_pinecone['metadata']['text'][:50]}\")\n",
    "        return {'final_results': final_results, 'retrieved_correct_position': retrieved_correct_position, 'reranked_correct_position': reranked_correct_position, 'results_from_pinecone': results_from_pinecone, 'top_re_rank_score': top_re_rank_score}\n",
    "\n",
    "    if verbose:\n",
    "        print('Document ID (Hash)\\t\\tRetrieval Score\\tText')\n",
    "    for result_from_pinecone in results_from_pinecone:\n",
    "        final_results.append(result_from_pinecone)\n",
    "        if verbose:\n",
    "            print(f\"{result_from_pinecone['id']}\\t{result_from_pinecone['score']:.2f}\\t{result_from_pinecone['metadata']['text'][:50]}\")\n",
    "\n",
    "    return {'final_results': final_results, 'retrieved_correct_position': retrieved_correct_position, 'reranked_correct_position': reranked_correct_position}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "118a061c-db0a-4903-8260-46c6f15189ae",
   "metadata": {
    "id": "118a061c-db0a-4903-8260-46c6f15189ae"
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "b25a8a8f-e873-43e7-9f56-b57bdf328416",
   "metadata": {
    "id": "b25a8a8f-e873-43e7-9f56-b57bdf328416"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/homebrew/lib/python3.11/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "# Pre-trained cross encoder\n",
    "cross_encoder = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-12-v2', num_labels=1)\n",
    "\n",
    "q_to_hash = {data['question']: my_hash(data['context']) for data in dataset['test']}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "vptFN0wPw0uS",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "vptFN0wPw0uS",
    "outputId": "72a9e946-3b3a-429b-b476-a945e94e26ec"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1148"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unique_inputs = list(set(dataset['test']['question']))\n",
    "len(unique_inputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "dc56237c-f9d6-4b3d-a8ac-31098cf4f904",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "How close did John make it to Johnston Atoll?\n",
      "The origins of Hurricane John were thought by the United States National Hurricane Center (NHC) to be from a tropical wave that moved off the coast of Africa on July 25, 1994. The wave subsequently moved across the Atlantic Ocean and Caribbean without distinction, before it crossed Central America and moved into the Eastern Pacific Ocean on or around August 8. Upon entering the Eastern Pacific the wave gradually developed, before the NHC initiated advisories on the system and designated it as Tropical Depression Ten-E during August 11. The system was at this time moving westwards and located around 345 miles (555 km) to the south-southeast of Acapulco, Mexico. Quickly developing banding features and well-defined outflow, it was upgraded to a tropical storm and named John later that day.A strong ridge of high pressure over the northeastern Pacific Ocean forced John westward, where upper level wind shear kept John a tropical storm. Intensity fluctuated considerably, however, as shear levels varied. More than once, shear cleared away most of the clouds above John and nearly caused it to weaken to a tropical depression. However, after eight days of slow westward movement across the Pacific Ocean, shear lessened greatly on August 19, and John intensified significantly and was designated as a hurricane at 17:00 PDT. During an eighteen-hour period between August 19 and August 20, John further strengthened from a weak Category 1 hurricane to a Category 3 major hurricane. Around 1100 PDT on August 20, John crossed into the central Pacific, the first of three basin crosses John would make.After entering the central Pacific, John left the area monitored by the NHC and was instead monitored by the Central Pacific Hurricane Center (CPHC). As the storm moved slowly westward, Hurricane John continued to strengthen considerably in an increasingly favorable environment well south of the Hawaiian Islands; on August 22, John was designated a Category 5 hurricane on the Saffir–Simpson hurricane scale (the highest classification for hurricanes) and later that day (by Hawaii Standard Time) reached its peak intensity, with 1-minute sustained winds of 175 miles per hour (280 km/h) and a minimum central pressure of 929 millibars (27.4 inHg). Also, on August 22 (by Hawaii Standard Time), John made its closest approach to the Hawaiian Islands, 345 miles (500 km) to the south. John had threatened to turn north and affect the islands days before, but the ridge of high pressure that typically shields the islands from hurricanes kept John on its southerly path. Nonetheless, heavy rains and wind from the outer bands of John affected the islands.With the Hawaiian Islands behind it, John began a slow turn to the north, taking near-direct aim at Johnston Atoll, a small group of islands populated only by a United States military base. The storm slowly weakened from its peak as a Category 5 hurricane in the face of increasing shear, dropping down to a Category 1 hurricane with 90 miles per hour (145 km/h) maximum winds. On August 25 local time, John made its closest approach to the Johnston Atoll only 15 miles (24 km) to the north. On Johnston Atoll, sustained winds were reported up to 60 miles per hour (95 km/h), the equivalent of a strong tropical storm, and gusts up to 75 miles per hour (120 km/h) were recorded.\n"
     ]
    }
   ],
   "source": [
    "query = unique_inputs[0]\n",
    "print(query)\n",
    "\n",
    "for t in dataset['test']:\n",
    "    if t['question'] == query:\n",
    "        print(t['context'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "4b0da5ac-0345-45e2-9913-188590a31522",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(None, None)"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "query_result = get_results_from_pinecone(\n",
    "    query, \n",
    "    top_k=2, # grab 2 results\n",
    "    re_rank_model=cross_encoder, \n",
    "    correct_hash=q_to_hash[query],\n",
    "    verbose=False\n",
    "    )\n",
    "\n",
    "query_result['retrieved_correct_position'], query_result['reranked_correct_position']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "dfbb3b3c-9baa-4298-abd8-0e7b75dd24ec",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'final_results': [{'score': 0.99843186,\n",
       "   'id': 'a76b6a3dfcbdb1ca832bbf40710ad2c8',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:32.060499',\n",
       "    'text': \"John affected both the Hawaiian Islands and Johnston Atoll, but only lightly. While John passed over 345 miles (550 km) to the south of Hawaiʻi, the islands did experience strengthened trade winds and rough surf along the southeast- and south-facing shores, and, while moving westward, on west-facing shores as well. The waves, ranging from 6 to 10 ft (1.8 to 3.0 m) in height, flooded beach parks in Kailua-Kona. Additionally, heavy rains on the Big Island of Hawaiʻi caused minor, localized flooding and some short-term road closures. No deaths, injuries or significant damages were reported in Hawaiʻi.Although John passed within 25 km (16 mi) of Johnston Atoll, it had weakened greatly to a Category 1 system by closest approach. Prior to the storm's arrival, waves between 20 and 30 ft (6.1 and 9.1 m) were reported on the island. Additionally, in the Northern Hemisphere, the strongest winds and heaviest rain lie to the north of a tropical cyclone, so the atoll, which lay to the south of the storm's path, was spared the brunt of the storm. Nonetheless, the 1,100-man personnel for the United States military base on Johnston Atoll had been evacuated to Honolulu as a precaution while John approached. Damage to structures was considerable, but the size of the island and relative functionality of the base led to low damage; monetary losses were estimated at close to $15 million (1994 US$).The remnants of John moved through the Aleutian Islands, producing a wind gust of 46 mph (74 km/h) in Unalaska. The storm brought a plume of warm air, and two stations recorded a high temperature of 66 °F (19 °C).\"}},\n",
       "  {'score': 0.991396,\n",
       "   'id': '8f3fd30f7d46c05089f7f84d71806b77',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:41.323346',\n",
       "    'text': \"Clearing Johnston Atoll, John turned to the northwest and began strengthening again as shear decreased. On August 27 local time, John reached a secondary peak strength of 135 miles per hour (210 km/h), and shortly thereafter it crossed the International Date Line at approximately 22° N and came under the surveillance of the Guam branch of the Joint Typhoon Warning Center (JTWC). By crossing into the western Pacific, John also became a typhoon and was referred to as Typhoon John during its time in the western Pacific. Immediately after crossing the Date Line, John again weakened and its forward motion stalled. By September 1, John had weakened to a tropical storm and was nearly motionless just west of the Date Line. There, John lingered for six days while performing a multi-day counterclockwise loop. On September 7, a trough moved into the area and quickly moved John to the northeast. John crossed the Date Line again on September 8 and reentered the central Pacific.After reentering the central Pacific, John briefly reached a tertiary peak strength of 90 miles per hour (145 km/h), a strong Category 1 hurricane, well to the north of Midway Island. However, the trough was rapidly pulling apart John's structure, and the cold waters of the northern central Pacific were not conducive to a tropical cyclone. On September 10, the 120th advisory was released on the system, finally declaring John to have become extratropical approximately 1,000 miles (1600 km) south of Unalaska Island.\"}}],\n",
       " 'retrieved_correct_position': None,\n",
       " 'reranked_correct_position': None,\n",
       " 'results_from_pinecone': [{'id': 'a76b6a3dfcbdb1ca832bbf40710ad2c8',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:32.060499',\n",
       "                'text': 'John affected both the Hawaiian Islands and Johnston '\n",
       "                        'Atoll, but only lightly. While John passed over 345 '\n",
       "                        'miles (550 km) to the south of Hawaiʻi, the islands did '\n",
       "                        'experience strengthened trade winds and rough surf '\n",
       "                        'along the southeast- and south-facing shores, and, '\n",
       "                        'while moving westward, on west-facing shores as well. '\n",
       "                        'The waves, ranging from 6 to 10 ft (1.8 to 3.0 m) in '\n",
       "                        'height, flooded beach parks in Kailua-Kona. '\n",
       "                        'Additionally, heavy rains on the Big Island of Hawaiʻi '\n",
       "                        'caused minor, localized flooding and some short-term '\n",
       "                        'road closures. No deaths, injuries or significant '\n",
       "                        'damages were reported in Hawaiʻi.Although John passed '\n",
       "                        'within 25 km (16 mi) of Johnston Atoll, it had weakened '\n",
       "                        'greatly to a Category 1 system by closest approach. '\n",
       "                        \"Prior to the storm's arrival, waves between 20 and 30 \"\n",
       "                        'ft (6.1 and 9.1 m) were reported on the island. '\n",
       "                        'Additionally, in the Northern Hemisphere, the strongest '\n",
       "                        'winds and heaviest rain lie to the north of a tropical '\n",
       "                        'cyclone, so the atoll, which lay to the south of the '\n",
       "                        \"storm's path, was spared the brunt of the storm. \"\n",
       "                        'Nonetheless, the 1,100-man personnel for the United '\n",
       "                        'States military base on Johnston Atoll had been '\n",
       "                        'evacuated to Honolulu as a precaution while John '\n",
       "                        'approached. Damage to structures was considerable, but '\n",
       "                        'the size of the island and relative functionality of '\n",
       "                        'the base led to low damage; monetary losses were '\n",
       "                        'estimated at close to $15 million (1994 US$).The '\n",
       "                        'remnants of John moved through the Aleutian Islands, '\n",
       "                        'producing a wind gust of 46 mph (74 km/h) in Unalaska. '\n",
       "                        'The storm brought a plume of warm air, and two stations '\n",
       "                        'recorded a high temperature of 66 °F (19 °C).'},\n",
       "   'score': 0.593409777,\n",
       "   'values': []},\n",
       "  {'id': '8f3fd30f7d46c05089f7f84d71806b77',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:41.323346',\n",
       "                'text': 'Clearing Johnston Atoll, John turned to the northwest '\n",
       "                        'and began strengthening again as shear decreased. On '\n",
       "                        'August 27 local time, John reached a secondary peak '\n",
       "                        'strength of 135 miles per hour (210 km/h), and shortly '\n",
       "                        'thereafter it crossed the International Date Line at '\n",
       "                        'approximately 22° N and came under the surveillance of '\n",
       "                        'the Guam branch of the Joint Typhoon Warning Center '\n",
       "                        '(JTWC). By crossing into the western Pacific, John also '\n",
       "                        'became a typhoon and was referred to as Typhoon John '\n",
       "                        'during its time in the western Pacific. Immediately '\n",
       "                        'after crossing the Date Line, John again weakened and '\n",
       "                        'its forward motion stalled. By September 1, John had '\n",
       "                        'weakened to a tropical storm and was nearly motionless '\n",
       "                        'just west of the Date Line. There, John lingered for '\n",
       "                        'six days while performing a multi-day counterclockwise '\n",
       "                        'loop. On September 7, a trough moved into the area and '\n",
       "                        'quickly moved John to the northeast. John crossed the '\n",
       "                        'Date Line again on September 8 and reentered the '\n",
       "                        'central Pacific.After reentering the central Pacific, '\n",
       "                        'John briefly reached a tertiary peak strength of 90 '\n",
       "                        'miles per hour (145 km/h), a strong Category 1 '\n",
       "                        'hurricane, well to the north of Midway Island. However, '\n",
       "                        \"the trough was rapidly pulling apart John's structure, \"\n",
       "                        'and the cold waters of the northern central Pacific '\n",
       "                        'were not conducive to a tropical cyclone. On September '\n",
       "                        '10, the 120th advisory was released on the system, '\n",
       "                        'finally declaring John to have become extratropical '\n",
       "                        'approximately 1,000 miles (1600 km) south of Unalaska '\n",
       "                        'Island.'},\n",
       "   'score': 0.564386189,\n",
       "   'values': []}],\n",
       " 'top_re_rank_score': 0.99843186}"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "query_result  # the right context isn't there!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "caa66ac8-d69c-49a1-9f55-e9ef93379fec",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "caa66ac8-d69c-49a1-9f55-e9ef93379fec",
    "outputId": "575fa7f5-32dc-4a03-8f31-01df1ee11cc4"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 2)"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "query_result = get_results_from_pinecone(\n",
    "    query, \n",
    "    top_k=10, # grab 10 results\n",
    "    re_rank_model=cross_encoder, correct_hash=q_to_hash[query],\n",
    "    verbose=False\n",
    "    )\n",
    "\n",
    "query_result['retrieved_correct_position'], query_result['reranked_correct_position']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "de1c0500-db49-4be2-8f3b-73ba96ec096b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'final_results': [{'score': 0.998432,\n",
       "   'id': 'a76b6a3dfcbdb1ca832bbf40710ad2c8',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:32.060499',\n",
       "    'text': \"John affected both the Hawaiian Islands and Johnston Atoll, but only lightly. While John passed over 345 miles (550 km) to the south of Hawaiʻi, the islands did experience strengthened trade winds and rough surf along the southeast- and south-facing shores, and, while moving westward, on west-facing shores as well. The waves, ranging from 6 to 10 ft (1.8 to 3.0 m) in height, flooded beach parks in Kailua-Kona. Additionally, heavy rains on the Big Island of Hawaiʻi caused minor, localized flooding and some short-term road closures. No deaths, injuries or significant damages were reported in Hawaiʻi.Although John passed within 25 km (16 mi) of Johnston Atoll, it had weakened greatly to a Category 1 system by closest approach. Prior to the storm's arrival, waves between 20 and 30 ft (6.1 and 9.1 m) were reported on the island. Additionally, in the Northern Hemisphere, the strongest winds and heaviest rain lie to the north of a tropical cyclone, so the atoll, which lay to the south of the storm's path, was spared the brunt of the storm. Nonetheless, the 1,100-man personnel for the United States military base on Johnston Atoll had been evacuated to Honolulu as a precaution while John approached. Damage to structures was considerable, but the size of the island and relative functionality of the base led to low damage; monetary losses were estimated at close to $15 million (1994 US$).The remnants of John moved through the Aleutian Islands, producing a wind gust of 46 mph (74 km/h) in Unalaska. The storm brought a plume of warm air, and two stations recorded a high temperature of 66 °F (19 °C).\"}},\n",
       "  {'score': 0.991396,\n",
       "   'id': '8f3fd30f7d46c05089f7f84d71806b77',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:41.323346',\n",
       "    'text': \"Clearing Johnston Atoll, John turned to the northwest and began strengthening again as shear decreased. On August 27 local time, John reached a secondary peak strength of 135 miles per hour (210 km/h), and shortly thereafter it crossed the International Date Line at approximately 22° N and came under the surveillance of the Guam branch of the Joint Typhoon Warning Center (JTWC). By crossing into the western Pacific, John also became a typhoon and was referred to as Typhoon John during its time in the western Pacific. Immediately after crossing the Date Line, John again weakened and its forward motion stalled. By September 1, John had weakened to a tropical storm and was nearly motionless just west of the Date Line. There, John lingered for six days while performing a multi-day counterclockwise loop. On September 7, a trough moved into the area and quickly moved John to the northeast. John crossed the Date Line again on September 8 and reentered the central Pacific.After reentering the central Pacific, John briefly reached a tertiary peak strength of 90 miles per hour (145 km/h), a strong Category 1 hurricane, well to the north of Midway Island. However, the trough was rapidly pulling apart John's structure, and the cold waters of the northern central Pacific were not conducive to a tropical cyclone. On September 10, the 120th advisory was released on the system, finally declaring John to have become extratropical approximately 1,000 miles (1600 km) south of Unalaska Island.\"}},\n",
       "  {'score': 0.32219857,\n",
       "   'id': '29f43cf2a1e4b7da49f726bbf846044f',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:58.291507',\n",
       "    'text': 'The origins of Hurricane John were thought by the United States National Hurricane Center (NHC) to be from a tropical wave that moved off the coast of Africa on July 25, 1994. The wave subsequently moved across the Atlantic Ocean and Caribbean without distinction, before it crossed Central America and moved into the Eastern Pacific Ocean on or around August 8. Upon entering the Eastern Pacific the wave gradually developed, before the NHC initiated advisories on the system and designated it as Tropical Depression Ten-E during August 11. The system was at this time moving westwards and located around 345 miles (555 km) to the south-southeast of Acapulco, Mexico. Quickly developing banding features and well-defined outflow, it was upgraded to a tropical storm and named John later that day.A strong ridge of high pressure over the northeastern Pacific Ocean forced John westward, where upper level wind shear kept John a tropical storm. Intensity fluctuated considerably, however, as shear levels varied. More than once, shear cleared away most of the clouds above John and nearly caused it to weaken to a tropical depression. However, after eight days of slow westward movement across the Pacific Ocean, shear lessened greatly on August 19, and John intensified significantly and was designated as a hurricane at 17:00 PDT. During an eighteen-hour period between August 19 and August 20, John further strengthened from a weak Category 1 hurricane to a Category 3 major hurricane. Around 1100 PDT on August 20, John crossed into the central Pacific, the first of three basin crosses John would make.After entering the central Pacific, John left the area monitored by the NHC and was instead monitored by the Central Pacific Hurricane Center (CPHC). As the storm moved slowly westward, Hurricane John continued to strengthen considerably in an increasingly favorable environment well south of the Hawaiian Islands; on August 22, John was designated a Category 5 hurricane on the Saffir–Simpson hurricane scale (the highest classification for hurricanes) and later that day (by Hawaii Standard Time) reached its peak intensity, with 1-minute sustained winds of 175 miles per hour (280 km/h) and a minimum central pressure of 929 millibars (27.4 inHg). Also, on August 22 (by Hawaii Standard Time), John made its closest approach to the Hawaiian Islands, 345 miles (500 km) to the south. John had threatened to turn north and affect the islands days before, but the ridge of high pressure that typically shields the islands from hurricanes kept John on its southerly path. Nonetheless, heavy rains and wind from the outer bands of John affected the islands.With the Hawaiian Islands behind it, John began a slow turn to the north, taking near-direct aim at Johnston Atoll, a small group of islands populated only by a United States military base. The storm slowly weakened from its peak as a Category 5 hurricane in the face of increasing shear, dropping down to a Category 1 hurricane with 90 miles per hour (145 km/h) maximum winds. On August 25 local time, John made its closest approach to the Johnston Atoll only 15 miles (24 km) to the north. On Johnston Atoll, sustained winds were reported up to 60 miles per hour (95 km/h), the equivalent of a strong tropical storm, and gusts up to 75 miles per hour (120 km/h) were recorded.'}},\n",
       "  {'score': 0.00035284052,\n",
       "   'id': '29d27c6f43d083d4c282bdb5e7ab51a2',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:45:56.884103',\n",
       "    'text': 'At the same time, however, two separate ship reports indicated that John had sustained winds of at least 55 knots (100 km/h, 65 mph), far stronger than the advisory strength of 35 knots (65 km/h, 40 mph). John would go on to restrengthen into a strong Category 1 hurricane after reentering the Central North Pacific, defying all JTWC predictions. After later reanalysis, the JTWC raised the estimated wind speeds of John for every advisory from 1200 UTC September 1 to its final advisory exactly a week later by at least 5 knots (9 km/h, 6 mph) and as much as 25 knots (46 km/h, 29 mph).'}},\n",
       "  {'score': 0.00029191337,\n",
       "   'id': '86b032a63e2f13222643295ae9a96fcc',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:45:56.884103',\n",
       "    'text': \"During John's time in the Western North Pacific, the Joint Typhoon Warning Center (JTWC) had particular difficulty in forecasting and even estimating the strength of John. John weakened considerably after entering the Western North Pacific, and, before estimates were later revised, four consecutive advisories were issued that declared John a tropical depression. Each of these advisories called for imminent dissipation. As John persisted and did not dissipate as the JTWC had predicted, it was upgraded to a minimal tropical storm in the next advisory.\"}},\n",
       "  {'score': 8.675499e-05,\n",
       "   'id': '757483e06a54900810afc0ab86b020c4',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:52.938765',\n",
       "    'text': \"Johnston was born and raised in Ontario, studying there before enrolling at Harvard University and later Cambridge and Queen's universities. He went on to work as a professor at various post-secondary institutions in Canada, eventually serving administrative roles as dean of law at the University of Western Ontario, principal of McGill University, and president of the University of Waterloo. At the same time, Johnston involved himself with politics and public service, moderating political debates and chairing commissions in both the federal and provincial spheres, his most renowned position in that field being the chairmanship of the inquiry into the Airbus affair. He was in 2010 appointed as governor general by Queen Elizabeth II, on the recommendation of then Prime Minister of Canada Stephen Harper, to replace Michaëlle Jean as viceroy and he occupied the post until succeeded by Julie Payette in 2017. At the time, Johnston was predominantly praised as a worthy choice for the Queen's representative, though his appointment was denounced by some Quebec sovereigntists.\"}},\n",
       "  {'score': 8.4590385e-05,\n",
       "   'id': 'c31dd2e7e6cbe2ab80361f321e57d725',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:47:15.201237',\n",
       "    'text': \"Hurricane Norman originated from a broad area of low pressure that formed several hundred miles south-southwest of Acapulco, Mexico on August 25. Traveling west-northwest, the system coalesced into a tropical depression by at 15:00 UTC on August 28 while situated approximately 420 miles (675 km) south-southwest of the southern tip of Baja California. A subtropical ridge steered the system west for several days. Early on August 29, the depression intensified into a tropical storm and received the name Norman. Favorable environmental conditions enabled quick intensification, and the system achieved hurricane strength early on August 30. Rapid intensification ensued throughout the day, culminating with Norman attaining its peak intensity at 15:00 UTC, with sustained winds of 150 mph (240 km/h) and a central pressure of 937 mbar (27.67 inHg). During a 24-hour period, the hurricane's winds increased by 80 mph (130 km/h), the largest such increase since Hurricane Patricia in 2015.The combination of an eyewall replacement cycle and increasing wind shear induced weakening beginning on August 31. At 03:00 UTC on August 31, Norman turned to the west-southwest due to a deep-layer ridge to the north. Norman fell to Category 2 status for a period, before unexpectedly rapidly intensifying back to a Category 4 hurricane on September 2. The storm attained a secondary peak with winds of 140 mph (235 km/h) and a pressure of 947 mbar (28.00 inHg). Initially proving resilient to adverse conditions, Norman succumbed to increasing wind shear and lower sea surface temperatures on September 3. Its central dense overcast warmed and its eye filled. At the same time, Norman took a turn to a more westerly direction. On September 4, the hurricane crossed west of 140°W, and warning responsibility shifted to the Central Pacific Hurricane Center (CPHC). On the next day, another bout of unexpected intensification ensued and Norman regained major hurricane status. However, wind shear increased once again thereafter, and Norman weakened into a Category 1 hurricane on September 6. On September 7, Norman weakened further to a tropical storm as it began to lose its tropical characteristics. The CPHC issued its final advisory on Norman at 21:00 UTC on September 8, as it was rapidly becoming extratropical; Norman subsequently completed its extratropical transition on the next day.\"}},\n",
       "  {'score': 7.123619e-05,\n",
       "   'id': '7ac86164fe9f53c7ce92529fa5904f4e',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:26.299391',\n",
       "    'text': \"On 18 August 1916, Kronprinz took part in an operation to bombard Sunderland. Admiral Scheer attempted a repeat of the original 31 May plan; the two serviceable German battlecruisers—Moltke and Von der Tann—supported by three dreadnoughts, were to bombard the coastal town of Sunderland in an attempt to draw out and destroy Beatty's battlecruisers. The rest of the fleet, including Kronprinz, would trail behind and provide cover. The British were aware of the German plans and sortied the Grand Fleet to meet them. By 14:35, Admiral Scheer had been warned of the Grand Fleet's approach and, unwilling to engage the whole of the Grand Fleet just eleven weeks after the decidedly close call at Jutland, turned his forces around and retreated to German ports.Kronprinz participated in two uneventful fleet operations, one a month prior on 16 July to the north of Helgoland, and one into the North Sea on 18–20 October. Kronprinz and the rest of III Squadron were sent to the Baltic directly afterward for training, which lasted until 2 November. Upon returning from the Baltic, Kronprinz and the rest of III Squadron were ordered to cover the retrieval of a pair of U-boats that were stranded on the Danish coast. On the return trip, on 5 November 1916, Kronprinz was torpedoed by the British submarine J1 near Horns Reef. The torpedo struck the ship beneath the forward-most gun turret and allowed approximately 250 metric tons (250 long tons; 280 short tons) of water into the ship. Kronprinz maintained her speed and reached port. The following day she was placed in drydock at the Imperial Dockyard in Wilhelmshaven for repairs, which lasted from 6 November to 4 December. During this period, Bernhard Rösing took command of the vessel.After returning to III Squadron, Kronprinz took part in squadron training in the Baltic before conducting defensive patrols in the German Bight. In early 1917, the ship became the flagship of the deputy commander of the squadron, at that time Rear Admiral Karl Seiferling. During training maneuvers on 5 March 1917, Kronprinz was accidentally rammed by her sister ship Grosser Kurfürst in the Heligoland Bight. The collision caused minor flooding in the area abreast of her forward superfiring turret; Kronprinz shipped some 600 t (590 long tons; 660 short tons) of water. She again went into the drydock in Wilhelmshaven, from 6 March to 14 May. On 11 September, Kronprinz was detached for training in the Baltic. She then joined the Special Unit for Operation Albion.\"}},\n",
       "  {'score': 1.6988468e-05,\n",
       "   'id': 'b38a1c1b709975f51326970267e67bb7',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:47:20.914703',\n",
       "    'text': \"Kennedy was born in Brookline, Massachusetts and graduated from Harvard University in 1940 before joining the U.S. Naval Reserve the following year. During World War II, he commanded a series of PT boats in the Pacific theater and earned the Navy and Marine Corps Medal for his service. After the war, Kennedy represented the 11th congressional district of Massachusetts in the U.S. House of Representatives from 1947 to 1953. He was subsequently elected to the U.S. Senate and served as the junior Senator from Massachusetts from 1953 to 1960. While in the Senate, he published his book  Profiles in Courage, which won a Pulitzer Prize for Biography. In the 1960 presidential election, Kennedy narrowly defeated Republican opponent Richard Nixon, who was the incumbent vice president. At age 43, he became the second-youngest person to serve as president, the youngest person to be elected as U.S. president, as well as the only Roman Catholic to occupy that office. He was also the first president to have served in the U.S. Navy.Kennedy's time in office was marked by high tensions with communist states in the Cold War. He increased the number of American military advisers in South Vietnam by a factor of 18 over President Dwight D. Eisenhower. In April 1961, he authorized a failed joint-CIA attempt to overthrow the Cuban government of Fidel Castro in the Bay of Pigs Invasion. He subsequently rejected Operation Northwoods plans by the Joint Chiefs of Staff to orchestrate false flag attacks on American soil in order to gain public approval for a war against Cuba. However his administration continued to plan for an invasion of Cuba in the summer of 1962. In October 1962, U.S. spy planes discovered that Soviet missile bases had been deployed in Cuba; the resulting period of tensions, termed the Cuban Missile Crisis, nearly resulted in the breakout of a global thermonuclear conflict. Domestically, Kennedy presided over the establishment of the Peace Corps and supported the civil rights movement, but was only somewhat successful in passing his New Frontier domestic policies.\"}},\n",
       "  {'score': 1.4858122e-05,\n",
       "   'id': '413ce9a56e49699b6057daed5a44f81e',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:45:56.884103',\n",
       "    'text': 'On August 29, an upper-level low absorbed the remnants of Hurricane Lane to the west-northwest of Hawaii. The storm was assigned the designation 96C by the United States Naval Research Laboratory (NRL). Traversing an area with sea surface temperatures 2 °C (3.6 °F) above-normal, the system coalesced into a subtropical storm by August 31. On September 2, the system reached its peak intensity and began to display an eye. Afterward, the system gradually began to weaken, while accelerating northward into colder waters. On September 3, the system weakened below tropical depression intensity, back into an extratropical low. On September 4, the system was absorbed by a larger extratropical storm in the Bering Sea.'}}],\n",
       " 'retrieved_correct_position': 2,\n",
       " 'reranked_correct_position': 2,\n",
       " 'results_from_pinecone': [{'id': 'a76b6a3dfcbdb1ca832bbf40710ad2c8',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:32.060499',\n",
       "                'text': 'John affected both the Hawaiian Islands and Johnston '\n",
       "                        'Atoll, but only lightly. While John passed over 345 '\n",
       "                        'miles (550 km) to the south of Hawaiʻi, the islands did '\n",
       "                        'experience strengthened trade winds and rough surf '\n",
       "                        'along the southeast- and south-facing shores, and, '\n",
       "                        'while moving westward, on west-facing shores as well. '\n",
       "                        'The waves, ranging from 6 to 10 ft (1.8 to 3.0 m) in '\n",
       "                        'height, flooded beach parks in Kailua-Kona. '\n",
       "                        'Additionally, heavy rains on the Big Island of Hawaiʻi '\n",
       "                        'caused minor, localized flooding and some short-term '\n",
       "                        'road closures. No deaths, injuries or significant '\n",
       "                        'damages were reported in Hawaiʻi.Although John passed '\n",
       "                        'within 25 km (16 mi) of Johnston Atoll, it had weakened '\n",
       "                        'greatly to a Category 1 system by closest approach. '\n",
       "                        \"Prior to the storm's arrival, waves between 20 and 30 \"\n",
       "                        'ft (6.1 and 9.1 m) were reported on the island. '\n",
       "                        'Additionally, in the Northern Hemisphere, the strongest '\n",
       "                        'winds and heaviest rain lie to the north of a tropical '\n",
       "                        'cyclone, so the atoll, which lay to the south of the '\n",
       "                        \"storm's path, was spared the brunt of the storm. \"\n",
       "                        'Nonetheless, the 1,100-man personnel for the United '\n",
       "                        'States military base on Johnston Atoll had been '\n",
       "                        'evacuated to Honolulu as a precaution while John '\n",
       "                        'approached. Damage to structures was considerable, but '\n",
       "                        'the size of the island and relative functionality of '\n",
       "                        'the base led to low damage; monetary losses were '\n",
       "                        'estimated at close to $15 million (1994 US$).The '\n",
       "                        'remnants of John moved through the Aleutian Islands, '\n",
       "                        'producing a wind gust of 46 mph (74 km/h) in Unalaska. '\n",
       "                        'The storm brought a plume of warm air, and two stations '\n",
       "                        'recorded a high temperature of 66 °F (19 °C).'},\n",
       "   'score': 0.593409777,\n",
       "   'values': []},\n",
       "  {'id': '8f3fd30f7d46c05089f7f84d71806b77',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:41.323346',\n",
       "                'text': 'Clearing Johnston Atoll, John turned to the northwest '\n",
       "                        'and began strengthening again as shear decreased. On '\n",
       "                        'August 27 local time, John reached a secondary peak '\n",
       "                        'strength of 135 miles per hour (210 km/h), and shortly '\n",
       "                        'thereafter it crossed the International Date Line at '\n",
       "                        'approximately 22° N and came under the surveillance of '\n",
       "                        'the Guam branch of the Joint Typhoon Warning Center '\n",
       "                        '(JTWC). By crossing into the western Pacific, John also '\n",
       "                        'became a typhoon and was referred to as Typhoon John '\n",
       "                        'during its time in the western Pacific. Immediately '\n",
       "                        'after crossing the Date Line, John again weakened and '\n",
       "                        'its forward motion stalled. By September 1, John had '\n",
       "                        'weakened to a tropical storm and was nearly motionless '\n",
       "                        'just west of the Date Line. There, John lingered for '\n",
       "                        'six days while performing a multi-day counterclockwise '\n",
       "                        'loop. On September 7, a trough moved into the area and '\n",
       "                        'quickly moved John to the northeast. John crossed the '\n",
       "                        'Date Line again on September 8 and reentered the '\n",
       "                        'central Pacific.After reentering the central Pacific, '\n",
       "                        'John briefly reached a tertiary peak strength of 90 '\n",
       "                        'miles per hour (145 km/h), a strong Category 1 '\n",
       "                        'hurricane, well to the north of Midway Island. However, '\n",
       "                        \"the trough was rapidly pulling apart John's structure, \"\n",
       "                        'and the cold waters of the northern central Pacific '\n",
       "                        'were not conducive to a tropical cyclone. On September '\n",
       "                        '10, the 120th advisory was released on the system, '\n",
       "                        'finally declaring John to have become extratropical '\n",
       "                        'approximately 1,000 miles (1600 km) south of Unalaska '\n",
       "                        'Island.'},\n",
       "   'score': 0.564386189,\n",
       "   'values': []},\n",
       "  {'id': '29f43cf2a1e4b7da49f726bbf846044f',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:58.291507',\n",
       "                'text': 'The origins of Hurricane John were thought by the '\n",
       "                        'United States National Hurricane Center (NHC) to be '\n",
       "                        'from a tropical wave that moved off the coast of Africa '\n",
       "                        'on July 25, 1994. The wave subsequently moved across '\n",
       "                        'the Atlantic Ocean and Caribbean without distinction, '\n",
       "                        'before it crossed Central America and moved into the '\n",
       "                        'Eastern Pacific Ocean on or around August 8. Upon '\n",
       "                        'entering the Eastern Pacific the wave gradually '\n",
       "                        'developed, before the NHC initiated advisories on the '\n",
       "                        'system and designated it as Tropical Depression Ten-E '\n",
       "                        'during August 11. The system was at this time moving '\n",
       "                        'westwards and located around 345 miles (555 km) to the '\n",
       "                        'south-southeast of Acapulco, Mexico. Quickly developing '\n",
       "                        'banding features and well-defined outflow, it was '\n",
       "                        'upgraded to a tropical storm and named John later that '\n",
       "                        'day.A strong ridge of high pressure over the '\n",
       "                        'northeastern Pacific Ocean forced John westward, where '\n",
       "                        'upper level wind shear kept John a tropical storm. '\n",
       "                        'Intensity fluctuated considerably, however, as shear '\n",
       "                        'levels varied. More than once, shear cleared away most '\n",
       "                        'of the clouds above John and nearly caused it to weaken '\n",
       "                        'to a tropical depression. However, after eight days of '\n",
       "                        'slow westward movement across the Pacific Ocean, shear '\n",
       "                        'lessened greatly on August 19, and John intensified '\n",
       "                        'significantly and was designated as a hurricane at '\n",
       "                        '17:00 PDT. During an eighteen-hour period between '\n",
       "                        'August 19 and August 20, John further strengthened from '\n",
       "                        'a weak Category 1 hurricane to a Category 3 major '\n",
       "                        'hurricane. Around 1100 PDT on August 20, John crossed '\n",
       "                        'into the central Pacific, the first of three basin '\n",
       "                        'crosses John would make.After entering the central '\n",
       "                        'Pacific, John left the area monitored by the NHC and '\n",
       "                        'was instead monitored by the Central Pacific Hurricane '\n",
       "                        'Center (CPHC). As the storm moved slowly westward, '\n",
       "                        'Hurricane John continued to strengthen considerably in '\n",
       "                        'an increasingly favorable environment well south of the '\n",
       "                        'Hawaiian Islands; on August 22, John was designated a '\n",
       "                        'Category 5 hurricane on the Saffir–Simpson hurricane '\n",
       "                        'scale (the highest classification for hurricanes) and '\n",
       "                        'later that day (by Hawaii Standard Time) reached its '\n",
       "                        'peak intensity, with 1-minute sustained winds of 175 '\n",
       "                        'miles per hour (280 km/h) and a minimum central '\n",
       "                        'pressure of 929 millibars (27.4 inHg). Also, on August '\n",
       "                        '22 (by Hawaii Standard Time), John made its closest '\n",
       "                        'approach to the Hawaiian Islands, 345 miles (500 km) to '\n",
       "                        'the south. John had threatened to turn north and affect '\n",
       "                        'the islands days before, but the ridge of high pressure '\n",
       "                        'that typically shields the islands from hurricanes kept '\n",
       "                        'John on its southerly path. Nonetheless, heavy rains '\n",
       "                        'and wind from the outer bands of John affected the '\n",
       "                        'islands.With the Hawaiian Islands behind it, John began '\n",
       "                        'a slow turn to the north, taking near-direct aim at '\n",
       "                        'Johnston Atoll, a small group of islands populated only '\n",
       "                        'by a United States military base. The storm slowly '\n",
       "                        'weakened from its peak as a Category 5 hurricane in the '\n",
       "                        'face of increasing shear, dropping down to a Category 1 '\n",
       "                        'hurricane with 90 miles per hour (145 km/h) maximum '\n",
       "                        'winds. On August 25 local time, John made its closest '\n",
       "                        'approach to the Johnston Atoll only 15 miles (24 km) to '\n",
       "                        'the north. On Johnston Atoll, sustained winds were '\n",
       "                        'reported up to 60 miles per hour (95 km/h), the '\n",
       "                        'equivalent of a strong tropical storm, and gusts up to '\n",
       "                        '75 miles per hour (120 km/h) were recorded.'},\n",
       "   'score': 0.516601801,\n",
       "   'values': []},\n",
       "  {'id': '29d27c6f43d083d4c282bdb5e7ab51a2',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:45:56.884103',\n",
       "                'text': 'At the same time, however, two separate ship reports '\n",
       "                        'indicated that John had sustained winds of at least 55 '\n",
       "                        'knots (100 km/h, 65 mph), far stronger than the '\n",
       "                        'advisory strength of 35 knots (65 km/h, 40 mph). John '\n",
       "                        'would go on to restrengthen into a strong Category 1 '\n",
       "                        'hurricane after reentering the Central North Pacific, '\n",
       "                        'defying all JTWC predictions. After later reanalysis, '\n",
       "                        'the JTWC raised the estimated wind speeds of John for '\n",
       "                        'every advisory from 1200 UTC September 1 to its final '\n",
       "                        'advisory exactly a week later by at least 5 knots (9 '\n",
       "                        'km/h, 6 mph) and as much as 25 knots (46 km/h, 29 '\n",
       "                        'mph).'},\n",
       "   'score': 0.448611259,\n",
       "   'values': []},\n",
       "  {'id': '86b032a63e2f13222643295ae9a96fcc',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:45:56.884103',\n",
       "                'text': \"During John's time in the Western North Pacific, the \"\n",
       "                        'Joint Typhoon Warning Center (JTWC) had particular '\n",
       "                        'difficulty in forecasting and even estimating the '\n",
       "                        'strength of John. John weakened considerably after '\n",
       "                        'entering the Western North Pacific, and, before '\n",
       "                        'estimates were later revised, four consecutive '\n",
       "                        'advisories were issued that declared John a tropical '\n",
       "                        'depression. Each of these advisories called for '\n",
       "                        'imminent dissipation. As John persisted and did not '\n",
       "                        'dissipate as the JTWC had predicted, it was upgraded to '\n",
       "                        'a minimal tropical storm in the next advisory.'},\n",
       "   'score': 0.446436226,\n",
       "   'values': []},\n",
       "  {'id': 'b38a1c1b709975f51326970267e67bb7',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:47:20.914703',\n",
       "                'text': 'Kennedy was born in Brookline, Massachusetts and '\n",
       "                        'graduated from Harvard University in 1940 before '\n",
       "                        'joining the U.S. Naval Reserve the following year. '\n",
       "                        'During World War II, he commanded a series of PT boats '\n",
       "                        'in the Pacific theater and earned the Navy and Marine '\n",
       "                        'Corps Medal for his service. After the war, Kennedy '\n",
       "                        'represented the 11th congressional district of '\n",
       "                        'Massachusetts in the U.S. House of Representatives from '\n",
       "                        '1947 to 1953. He was subsequently elected to the U.S. '\n",
       "                        'Senate and served as the junior Senator from '\n",
       "                        'Massachusetts from 1953 to 1960. While in the Senate, '\n",
       "                        'he published his book  Profiles in Courage, which won a '\n",
       "                        'Pulitzer Prize for Biography. In the 1960 presidential '\n",
       "                        'election, Kennedy narrowly defeated Republican opponent '\n",
       "                        'Richard Nixon, who was the incumbent vice president. At '\n",
       "                        'age 43, he became the second-youngest person to serve '\n",
       "                        'as president, the youngest person to be elected as U.S. '\n",
       "                        'president, as well as the only Roman Catholic to occupy '\n",
       "                        'that office. He was also the first president to have '\n",
       "                        \"served in the U.S. Navy.Kennedy's time in office was \"\n",
       "                        'marked by high tensions with communist states in the '\n",
       "                        'Cold War. He increased the number of American military '\n",
       "                        'advisers in South Vietnam by a factor of 18 over '\n",
       "                        'President Dwight D. Eisenhower. In April 1961, he '\n",
       "                        'authorized a failed joint-CIA attempt to overthrow the '\n",
       "                        'Cuban government of Fidel Castro in the Bay of Pigs '\n",
       "                        'Invasion. He subsequently rejected Operation Northwoods '\n",
       "                        'plans by the Joint Chiefs of Staff to orchestrate false '\n",
       "                        'flag attacks on American soil in order to gain public '\n",
       "                        'approval for a war against Cuba. However his '\n",
       "                        'administration continued to plan for an invasion of '\n",
       "                        'Cuba in the summer of 1962. In October 1962, U.S. spy '\n",
       "                        'planes discovered that Soviet missile bases had been '\n",
       "                        'deployed in Cuba; the resulting period of tensions, '\n",
       "                        'termed the Cuban Missile Crisis, nearly resulted in the '\n",
       "                        'breakout of a global thermonuclear conflict. '\n",
       "                        'Domestically, Kennedy presided over the establishment '\n",
       "                        'of the Peace Corps and supported the civil rights '\n",
       "                        'movement, but was only somewhat successful in passing '\n",
       "                        'his New Frontier domestic policies.'},\n",
       "   'score': 0.282856554,\n",
       "   'values': []},\n",
       "  {'id': '413ce9a56e49699b6057daed5a44f81e',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:45:56.884103',\n",
       "                'text': 'On August 29, an upper-level low absorbed the remnants '\n",
       "                        'of Hurricane Lane to the west-northwest of Hawaii. The '\n",
       "                        'storm was assigned the designation 96C by the United '\n",
       "                        'States Naval Research Laboratory (NRL). Traversing an '\n",
       "                        'area with sea surface temperatures 2 °C (3.6 °F) '\n",
       "                        'above-normal, the system coalesced into a subtropical '\n",
       "                        'storm by August 31. On September 2, the system reached '\n",
       "                        'its peak intensity and began to display an eye. '\n",
       "                        'Afterward, the system gradually began to weaken, while '\n",
       "                        'accelerating northward into colder waters. On September '\n",
       "                        '3, the system weakened below tropical depression '\n",
       "                        'intensity, back into an extratropical low. On September '\n",
       "                        '4, the system was absorbed by a larger extratropical '\n",
       "                        'storm in the Bering Sea.'},\n",
       "   'score': 0.278695226,\n",
       "   'values': []},\n",
       "  {'id': 'c31dd2e7e6cbe2ab80361f321e57d725',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:47:15.201237',\n",
       "                'text': 'Hurricane Norman originated from a broad area of low '\n",
       "                        'pressure that formed several hundred miles '\n",
       "                        'south-southwest of Acapulco, Mexico on August 25. '\n",
       "                        'Traveling west-northwest, the system coalesced into a '\n",
       "                        'tropical depression by at 15:00 UTC on August 28 while '\n",
       "                        'situated approximately 420 miles (675 km) '\n",
       "                        'south-southwest of the southern tip of Baja California. '\n",
       "                        'A subtropical ridge steered the system west for several '\n",
       "                        'days. Early on August 29, the depression intensified '\n",
       "                        'into a tropical storm and received the name Norman. '\n",
       "                        'Favorable environmental conditions enabled quick '\n",
       "                        'intensification, and the system achieved hurricane '\n",
       "                        'strength early on August 30. Rapid intensification '\n",
       "                        'ensued throughout the day, culminating with Norman '\n",
       "                        'attaining its peak intensity at 15:00 UTC, with '\n",
       "                        'sustained winds of 150 mph (240 km/h) and a central '\n",
       "                        'pressure of 937 mbar (27.67 inHg). During a 24-hour '\n",
       "                        \"period, the hurricane's winds increased by 80 mph (130 \"\n",
       "                        'km/h), the largest such increase since Hurricane '\n",
       "                        'Patricia in 2015.The combination of an eyewall '\n",
       "                        'replacement cycle and increasing wind shear induced '\n",
       "                        'weakening beginning on August 31. At 03:00 UTC on '\n",
       "                        'August 31, Norman turned to the west-southwest due to a '\n",
       "                        'deep-layer ridge to the north. Norman fell to Category '\n",
       "                        '2 status for a period, before unexpectedly rapidly '\n",
       "                        'intensifying back to a Category 4 hurricane on '\n",
       "                        'September 2. The storm attained a secondary peak with '\n",
       "                        'winds of 140 mph (235 km/h) and a pressure of 947 mbar '\n",
       "                        '(28.00 inHg). Initially proving resilient to adverse '\n",
       "                        'conditions, Norman succumbed to increasing wind shear '\n",
       "                        'and lower sea surface temperatures on September 3. Its '\n",
       "                        'central dense overcast warmed and its eye filled. At '\n",
       "                        'the same time, Norman took a turn to a more westerly '\n",
       "                        'direction. On September 4, the hurricane crossed west '\n",
       "                        'of 140°W, and warning responsibility shifted to the '\n",
       "                        'Central Pacific Hurricane Center (CPHC). On the next '\n",
       "                        'day, another bout of unexpected intensification ensued '\n",
       "                        'and Norman regained major hurricane status. However, '\n",
       "                        'wind shear increased once again thereafter, and Norman '\n",
       "                        'weakened into a Category 1 hurricane on September 6. On '\n",
       "                        'September 7, Norman weakened further to a tropical '\n",
       "                        'storm as it began to lose its tropical characteristics. '\n",
       "                        'The CPHC issued its final advisory on Norman at 21:00 '\n",
       "                        'UTC on September 8, as it was rapidly becoming '\n",
       "                        'extratropical; Norman subsequently completed its '\n",
       "                        'extratropical transition on the next day.'},\n",
       "   'score': 0.273503363,\n",
       "   'values': []},\n",
       "  {'id': '7ac86164fe9f53c7ce92529fa5904f4e',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:26.299391',\n",
       "                'text': 'On 18 August 1916, Kronprinz took part in an operation '\n",
       "                        'to bombard Sunderland. Admiral Scheer attempted a '\n",
       "                        'repeat of the original 31 May plan; the two serviceable '\n",
       "                        'German battlecruisers—Moltke and Von der Tann—supported '\n",
       "                        'by three dreadnoughts, were to bombard the coastal town '\n",
       "                        'of Sunderland in an attempt to draw out and destroy '\n",
       "                        \"Beatty's battlecruisers. The rest of the fleet, \"\n",
       "                        'including Kronprinz, would trail behind and provide '\n",
       "                        'cover. The British were aware of the German plans and '\n",
       "                        'sortied the Grand Fleet to meet them. By 14:35, Admiral '\n",
       "                        \"Scheer had been warned of the Grand Fleet's approach \"\n",
       "                        'and, unwilling to engage the whole of the Grand Fleet '\n",
       "                        'just eleven weeks after the decidedly close call at '\n",
       "                        'Jutland, turned his forces around and retreated to '\n",
       "                        'German ports.Kronprinz participated in two uneventful '\n",
       "                        'fleet operations, one a month prior on 16 July to the '\n",
       "                        'north of Helgoland, and one into the North Sea on 18–20 '\n",
       "                        'October. Kronprinz and the rest of III Squadron were '\n",
       "                        'sent to the Baltic directly afterward for training, '\n",
       "                        'which lasted until 2 November. Upon returning from the '\n",
       "                        'Baltic, Kronprinz and the rest of III Squadron were '\n",
       "                        'ordered to cover the retrieval of a pair of U-boats '\n",
       "                        'that were stranded on the Danish coast. On the return '\n",
       "                        'trip, on 5 November 1916, Kronprinz was torpedoed by '\n",
       "                        'the British submarine J1 near Horns Reef. The torpedo '\n",
       "                        'struck the ship beneath the forward-most gun turret and '\n",
       "                        'allowed approximately 250 metric tons (250 long tons; '\n",
       "                        '280 short tons) of water into the ship. Kronprinz '\n",
       "                        'maintained her speed and reached port. The following '\n",
       "                        'day she was placed in drydock at the Imperial Dockyard '\n",
       "                        'in Wilhelmshaven for repairs, which lasted from 6 '\n",
       "                        'November to 4 December. During this period, Bernhard '\n",
       "                        'Rösing took command of the vessel.After returning to '\n",
       "                        'III Squadron, Kronprinz took part in squadron training '\n",
       "                        'in the Baltic before conducting defensive patrols in '\n",
       "                        'the German Bight. In early 1917, the ship became the '\n",
       "                        'flagship of the deputy commander of the squadron, at '\n",
       "                        'that time Rear Admiral Karl Seiferling. During training '\n",
       "                        'maneuvers on 5 March 1917, Kronprinz was accidentally '\n",
       "                        'rammed by her sister ship Grosser Kurfürst in the '\n",
       "                        'Heligoland Bight. The collision caused minor flooding '\n",
       "                        'in the area abreast of her forward superfiring turret; '\n",
       "                        'Kronprinz shipped some 600 t (590 long tons; 660 short '\n",
       "                        'tons) of water. She again went into the drydock in '\n",
       "                        'Wilhelmshaven, from 6 March to 14 May. On 11 September, '\n",
       "                        'Kronprinz was detached for training in the Baltic. She '\n",
       "                        'then joined the Special Unit for Operation Albion.'},\n",
       "   'score': 0.269413084,\n",
       "   'values': []},\n",
       "  {'id': '757483e06a54900810afc0ab86b020c4',\n",
       "   'metadata': {'date_uploaded': '2024-02-04T15:46:52.938765',\n",
       "                'text': 'Johnston was born and raised in Ontario, studying there '\n",
       "                        'before enrolling at Harvard University and later '\n",
       "                        \"Cambridge and Queen's universities. He went on to work \"\n",
       "                        'as a professor at various post-secondary institutions '\n",
       "                        'in Canada, eventually serving administrative roles as '\n",
       "                        'dean of law at the University of Western Ontario, '\n",
       "                        'principal of McGill University, and president of the '\n",
       "                        'University of Waterloo. At the same time, Johnston '\n",
       "                        'involved himself with politics and public service, '\n",
       "                        'moderating political debates and chairing commissions '\n",
       "                        'in both the federal and provincial spheres, his most '\n",
       "                        'renowned position in that field being the chairmanship '\n",
       "                        'of the inquiry into the Airbus affair. He was in 2010 '\n",
       "                        'appointed as governor general by Queen Elizabeth II, on '\n",
       "                        'the recommendation of then Prime Minister of Canada '\n",
       "                        'Stephen Harper, to replace Michaëlle Jean as viceroy '\n",
       "                        'and he occupied the post until succeeded by Julie '\n",
       "                        'Payette in 2017. At the time, Johnston was '\n",
       "                        'predominantly praised as a worthy choice for the '\n",
       "                        \"Queen's representative, though his appointment was \"\n",
       "                        'denounced by some Quebec sovereigntists.'},\n",
       "   'score': 0.265240133,\n",
       "   'values': []}],\n",
       " 'top_re_rank_score': 0.998432}"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "query_result  # the 2nd position has the right context \"The origins of Hurricane John were...\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "a63ec53e",
   "metadata": {
    "id": "a63ec53e"
   },
   "outputs": [],
   "source": [
    "test_sample = dataset['test']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "21a3a147",
   "metadata": {
    "id": "21a3a147"
   },
   "outputs": [],
   "source": [
    "TOP_K=50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b98413a3",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "b98413a3",
    "outputId": "c6557744-6998-492f-db27-98b94ed7ec31",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  9%|▊         | 100/1148 [02:39<27:57,  1.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.78\n",
      "Accuracy with re-ranking: 0.84\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 17%|█▋        | 200/1148 [05:19<24:58,  1.58s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.765\n",
      "Accuracy with re-ranking: 0.835\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 26%|██▌       | 300/1148 [07:59<22:08,  1.57s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7666666666666667\n",
      "Accuracy with re-ranking: 0.8166666666666667\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 35%|███▍      | 400/1148 [12:10<19:30,  1.56s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7625\n",
      "Accuracy with re-ranking: 0.825\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 44%|████▎     | 500/1148 [14:50<17:13,  1.59s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.764\n",
      "Accuracy with re-ranking: 0.834\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 52%|█████▏    | 600/1148 [17:29<14:38,  1.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7683333333333333\n",
      "Accuracy with re-ranking: 0.8466666666666667\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 61%|██████    | 700/1148 [20:08<12:14,  1.64s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7471428571428571\n",
      "Accuracy with re-ranking: 0.8285714285714286\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 70%|██████▉   | 800/1148 [22:46<09:11,  1.58s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.74875\n",
      "Accuracy with re-ranking: 0.82125\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 78%|███████▊  | 900/1148 [25:26<06:36,  1.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7388888888888889\n",
      "Accuracy with re-ranking: 0.8188888888888889\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 87%|████████▋ | 1000/1148 [28:05<04:05,  1.66s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.741\n",
      "Accuracy with re-ranking: 0.819\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 96%|█████████▌| 1100/1148 [30:45<01:16,  1.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7509090909090909\n",
      "Accuracy with re-ranking: 0.8272727272727273\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1148/1148 [32:01<00:00,  1.67s/it]\n"
     ]
    }
   ],
   "source": [
    "logger.setLevel(logging.CRITICAL)\n",
    "\n",
    "predictions = []\n",
    "\n",
    "for question in tqdm(test_sample['question']):\n",
    "    r = get_results_from_pinecone(\n",
    "        question, top_k=TOP_K, re_rank_model=cross_encoder, correct_hash=q_to_hash[question],\n",
    "        verbose=False\n",
    "        )\n",
    "\n",
    "    r['retrieved_correct_position'], r['reranked_correct_position']\n",
    "    predictions.append(r)\n",
    "    if len(predictions) % 100 == 0:\n",
    "        retrieved_accuracy = sum([_['retrieved_correct_position'] == 0 for _ in predictions])/len(predictions)\n",
    "        re_ranked_accuracy = sum([_['reranked_correct_position'] == 0 for _ in predictions])/len(predictions)\n",
    "\n",
    "        print(f'Accuracy without re-ranking: {retrieved_accuracy}')\n",
    "        print(f'Accuracy with re-ranking: {re_ranked_accuracy}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a2ff94e7-0b78-40ca-8cf0-42e345439e8b",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "a2ff94e7-0b78-40ca-8cf0-42e345439e8b",
    "outputId": "a2cd7fd3-ae14-43dd-cab8-559f7878fd6f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7543554006968641\n",
      "Accuracy with re-ranking: 0.8327526132404182\n"
     ]
    }
   ],
   "source": [
    "retrieved_accuracy = sum([_['retrieved_correct_position'] == 0 for _ in predictions])/len(predictions)\n",
    "re_ranked_accuracy = sum([_['reranked_correct_position'] == 0 for _ in predictions])/len(predictions)\n",
    "\n",
    "print(f'Accuracy without re-ranking: {retrieved_accuracy}')\n",
    "print(f'Accuracy with re-ranking: {re_ranked_accuracy}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fT4FuVcf9ONw",
   "metadata": {
    "id": "fT4FuVcf9ONw"
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6649afac-9434-440b-b332-de9149a7ebfa",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "6649afac-9434-440b-b332-de9149a7ebfa",
    "outputId": "17b2e526-cd7e-409e-e0f3-2ae4afd29160"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-65b2749d-6c16-4a26-8a9c-7659badc9be6\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>final_results</th>\n",
       "      <th>retrieved_correct_position</th>\n",
       "      <th>reranked_correct_position</th>\n",
       "      <th>results_from_pinecone</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': '2f90090e21f19450887d5f3ff781e541',\n",
       " '...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': '49201636ad4102735125e146c0dbafa4',\n",
       " '...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': '80d92494d2b06f341842f1855d2938cf',\n",
       " '...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>[{'id': 'e3fd54f33b021ea3cf88b438fefcada7',\n",
       " '...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': '37ed40c20d4e1b9cc8d6cc27a4d0fff3',\n",
       " '...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-65b2749d-6c16-4a26-8a9c-7659badc9be6')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-65b2749d-6c16-4a26-8a9c-7659badc9be6 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-65b2749d-6c16-4a26-8a9c-7659badc9be6');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "<div id=\"df-b850ff8b-8fcc-433e-b65c-488a7c0db270\">\n",
       "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-b850ff8b-8fcc-433e-b65c-488a7c0db270')\"\n",
       "            title=\"Suggest charts\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "     width=\"24px\">\n",
       "    <g>\n",
       "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
       "    </g>\n",
       "</svg>\n",
       "  </button>\n",
       "\n",
       "<style>\n",
       "  .colab-df-quickchart {\n",
       "      --bg-color: #E8F0FE;\n",
       "      --fill-color: #1967D2;\n",
       "      --hover-bg-color: #E2EBFA;\n",
       "      --hover-fill-color: #174EA6;\n",
       "      --disabled-fill-color: #AAA;\n",
       "      --disabled-bg-color: #DDD;\n",
       "  }\n",
       "\n",
       "  [theme=dark] .colab-df-quickchart {\n",
       "      --bg-color: #3B4455;\n",
       "      --fill-color: #D2E3FC;\n",
       "      --hover-bg-color: #434B5C;\n",
       "      --hover-fill-color: #FFFFFF;\n",
       "      --disabled-bg-color: #3B4455;\n",
       "      --disabled-fill-color: #666;\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart {\n",
       "    background-color: var(--bg-color);\n",
       "    border: none;\n",
       "    border-radius: 50%;\n",
       "    cursor: pointer;\n",
       "    display: none;\n",
       "    fill: var(--fill-color);\n",
       "    height: 32px;\n",
       "    padding: 0;\n",
       "    width: 32px;\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart:hover {\n",
       "    background-color: var(--hover-bg-color);\n",
       "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "    fill: var(--button-hover-fill-color);\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart-complete:disabled,\n",
       "  .colab-df-quickchart-complete:disabled:hover {\n",
       "    background-color: var(--disabled-bg-color);\n",
       "    fill: var(--disabled-fill-color);\n",
       "    box-shadow: none;\n",
       "  }\n",
       "\n",
       "  .colab-df-spinner {\n",
       "    border: 2px solid var(--fill-color);\n",
       "    border-color: transparent;\n",
       "    border-bottom-color: var(--fill-color);\n",
       "    animation:\n",
       "      spin 1s steps(1) infinite;\n",
       "  }\n",
       "\n",
       "  @keyframes spin {\n",
       "    0% {\n",
       "      border-color: transparent;\n",
       "      border-bottom-color: var(--fill-color);\n",
       "      border-left-color: var(--fill-color);\n",
       "    }\n",
       "    20% {\n",
       "      border-color: transparent;\n",
       "      border-left-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "    }\n",
       "    30% {\n",
       "      border-color: transparent;\n",
       "      border-left-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "      border-right-color: var(--fill-color);\n",
       "    }\n",
       "    40% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "    }\n",
       "    60% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "    }\n",
       "    80% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "      border-bottom-color: var(--fill-color);\n",
       "    }\n",
       "    90% {\n",
       "      border-color: transparent;\n",
       "      border-bottom-color: var(--fill-color);\n",
       "    }\n",
       "  }\n",
       "</style>\n",
       "\n",
       "  <script>\n",
       "    async function quickchart(key) {\n",
       "      const quickchartButtonEl =\n",
       "        document.querySelector('#' + key + ' button');\n",
       "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
       "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
       "      try {\n",
       "        const charts = await google.colab.kernel.invokeFunction(\n",
       "            'suggestCharts', [key], {});\n",
       "      } catch (error) {\n",
       "        console.error('Error during call to suggestCharts:', error);\n",
       "      }\n",
       "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
       "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
       "    }\n",
       "    (() => {\n",
       "      let quickchartButtonEl =\n",
       "        document.querySelector('#df-b850ff8b-8fcc-433e-b65c-488a7c0db270 button');\n",
       "      quickchartButtonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "    })();\n",
       "  </script>\n",
       "</div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "text/plain": [
       "                                       final_results  \\\n",
       "0  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "1  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "2  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "3  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "4  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "\n",
       "   retrieved_correct_position  reranked_correct_position  \\\n",
       "0                         0.0                        0.0   \n",
       "1                         0.0                        0.0   \n",
       "2                         0.0                        0.0   \n",
       "3                         0.0                        2.0   \n",
       "4                         0.0                        0.0   \n",
       "\n",
       "                               results_from_pinecone  \n",
       "0  [{'id': '2f90090e21f19450887d5f3ff781e541',\n",
       " '...  \n",
       "1  [{'id': '49201636ad4102735125e146c0dbafa4',\n",
       " '...  \n",
       "2  [{'id': '80d92494d2b06f341842f1855d2938cf',\n",
       " '...  \n",
       "3  [{'id': 'e3fd54f33b021ea3cf88b438fefcada7',\n",
       " '...  \n",
       "4  [{'id': '37ed40c20d4e1b9cc8d6cc27a4d0fff3',\n",
       " '...  "
      ]
     },
     "execution_count": 285,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "predictions_df = pd.DataFrame(predictions)\n",
    "predictions_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "831397d3-606a-4c7f-b77f-6ee85bd24f7e",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "831397d3-606a-4c7f-b77f-6ee85bd24f7e",
    "outputId": "041c1a5c-cdef-4668-bb59-2700997c67ab"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "retrieved_correct_position    1.311052\n",
       "reranked_correct_position     0.682709\n",
       "dtype: float64"
      ]
     },
     "execution_count": 288,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predictions_df[['retrieved_correct_position', 'reranked_correct_position']].mean()  # lower is better"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eyv-6pPIEy0r",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "eyv-6pPIEy0r",
    "outputId": "4d82a213-bd82-44e4-d933-8d39870c2f4d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 866 956\n",
      "3 1009 1057\n",
      "5 1048 1077\n",
      "10 1072 1094\n",
      "25 1108 1120\n",
      "50 1122 1122\n"
     ]
    }
   ],
   "source": [
    "# do recall @ 1, 3, 5, 10\n",
    "for k in (1, 3, 5, 10, 25, 50):\n",
    "    embedding_only_recall = predictions_df[predictions_df['retrieved_correct_position'] < k].shape[0]\n",
    "    reranked_recall = predictions_df[predictions_df['reranked_correct_position'] < k].shape[0]\n",
    "    print(k, embedding_only_recall, reranked_recall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bd9aef05-e271-41e0-a8ce-88b6c81bed4c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "3f14809e",
   "metadata": {
    "id": "3f14809e"
   },
   "source": [
    "## OPEN SOURCE ALTERNATIVE TO EMBEDDING"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bfa9c8c7-4d9c-4217-b226-bc376394716d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "8ed58d3a-bed5-4f70-a4d6-3d624ab98868",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sentence_transformers import SentenceTransformer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "99138055",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 67,
     "referenced_widgets": [
      "c7800a5a8f1b4c3fa541df6b5ba6281f",
      "9d726c5753564258bbe1c281fa8bfefa",
      "ea3f511248734bbab197277b68346826",
      "3838d1bfccb5402d91ecf96f51f9c2d7",
      "ecc8ed6e869d4b01b7905ca951d0068c",
      "66f8508878e94e4296e2ffb009afdb75",
      "999f219c7c9449f0a48feb59eddd23eb",
      "7ab68b0af00248f5bbc15a39bbf38166",
      "b6ecc1cc5b2e4332b56fdc1614823d3e",
      "e732511315484861b39d0efb86b9cfb5",
      "3df968e9ff654de7bfc95f08c88a99c6"
     ]
    },
    "id": "99138055",
    "outputId": "2414eff0-be1c-44fb-be4c-a77d11ae4c57"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/homebrew/lib/python3.11/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "# load up our open source embedding model\n",
    "bi_encoder = SentenceTransformer(\"sentence-transformers/all-mpnet-base-v2\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a1140c18",
   "metadata": {
    "id": "a1140c18"
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "be37c48b",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 49,
     "referenced_widgets": [
      "0caf250cdae643479160eedc708ffeea",
      "fa6089718c574ee19bd3c378e356ea6b",
      "f78b642ffb784f9097e0cbf97c44b9bd",
      "7c322a232739486a937883ac787f8750",
      "1bc5237b0db94f4aa124c8c79a891955",
      "2c83393c2b7745889765d8efb4890763",
      "6854fe2978954c7b9e30202a6ea34b57",
      "4f4986d008434fc9912c496636b40b38",
      "348701c9256e4eb48b8ffb0d9c0d6c83",
      "11e5c44fa73c4d5d88561036f2a0a070",
      "9781773e5d4d4e0ab8e3ff3140bd0983"
     ]
    },
    "id": "be37c48b",
    "outputId": "aeec917e-853f-4b24-facc-c8c42468f3fd"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8aff0c10ce584f27b0989168c1c302e9",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Batches:   0%|          | 0/36 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Encode query and documents\n",
    "docs = dataset['test']['context']\n",
    "doc_emb = bi_encoder.encode(docs, batch_size=32, show_progress_bar=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "b9ec2a2d-9ca6-4f5e-a0db-3be16c2363ff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1148, 768)"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "doc_emb.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "4df00998-34d8-4f0b-9527-510d9515b233",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sentence_transformers.util import semantic_search\n",
    "\n",
    "# Function to find most similar document\n",
    "def find_most_similar(text, embeddings, documents, k=3):\n",
    "    query_embedding = bi_encoder.encode([text], show_progress_bar=False)\n",
    "    similarities = semantic_search(query_embedding, embeddings, top_k=k)\n",
    "    return [(documents[sim['corpus_id']], sim['score'], sim['corpus_id']) for sim in similarities[0]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "ae0afee7",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ae0afee7",
    "outputId": "2ea967ab-1dba-473e-ca08-9927fbe24da5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Who was Conduitt married to?\n"
     ]
    }
   ],
   "source": [
    "from random import sample\n",
    "\n",
    "query = sample(dataset['test']['question'], 1)[0]\n",
    "print(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "93280be8",
   "metadata": {
    "id": "93280be8"
   },
   "outputs": [],
   "source": [
    "def eval_ranking_open_source(query, top_k=3, re_rank_model=None):\n",
    "    ans = {'retrieved_correct_position': None}\n",
    "    correct_hash = q_to_hash[query]\n",
    "    results = find_most_similar(query, doc_emb, docs, k=top_k)\n",
    "    for idx, (passage, score, doc_idx) in enumerate(results):\n",
    "        if correct_hash == my_hash(passage):\n",
    "            ans['retrieved_correct_position'] =  idx\n",
    "    if re_rank_model is not None:\n",
    "        ans['reranked_correct_position'] = None\n",
    "        sentence_combinations = [(query, r[0]) for r in results]\n",
    "\n",
    "        # Compute the similarity scores for these combinations\n",
    "        similarity_scores = re_rank_model.predict(sentence_combinations, activation_fct=nn.Sigmoid())\n",
    "\n",
    "        # Sort the scores in decreasing order\n",
    "        sim_scores_argsort = list(reversed(np.argsort(similarity_scores)))\n",
    "        for i, idx in enumerate(sim_scores_argsort):\n",
    "            r = results[idx]\n",
    "            if correct_hash and my_hash(r[0]) == correct_hash:\n",
    "                ans['reranked_correct_position'] = i\n",
    "\n",
    "    return ans"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "06f198cd",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "06f198cd",
    "outputId": "ef371189-4a07-43b7-8761-da5ad013fdeb"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'retrieved_correct_position': 1, 'reranked_correct_position': 0}"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eval_ranking_open_source(query, top_k=TOP_K, re_rank_model=cross_encoder)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "389511fa-38d3-4538-987d-1ff8a83ac85d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1148/1148 [23:39<00:00,  1.24s/it]\n"
     ]
    }
   ],
   "source": [
    "logger.setLevel(logging.CRITICAL)\n",
    "os_predictions = []\n",
    "\n",
    "for i, question in tqdm(enumerate(test_sample), total=len(test_sample)):\n",
    "    os_predictions.append(eval_ranking_open_source(question['question'], top_k=TOP_K, re_rank_model=cross_encoder))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "935f031c-4965-4aed-aecd-0a2593f55115",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>retrieved_correct_position</th>\n",
       "      <th>reranked_correct_position</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   retrieved_correct_position  reranked_correct_position\n",
       "0                         0.0                        0.0\n",
       "1                         0.0                        0.0\n",
       "2                         0.0                        0.0\n",
       "3                         1.0                        0.0\n",
       "4                         0.0                        0.0"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os_predictions_df = pd.DataFrame(os_predictions)\n",
    "os_predictions_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "88419a17-598b-4b3e-b314-e1c5ef3475eb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.5017421602787456\n",
      "Accuracy with re-ranking: 0.6202090592334495\n"
     ]
    }
   ],
   "source": [
    "raw_accuracy = sum([p['retrieved_correct_position'] == 0 for p in os_predictions])/len(os_predictions)\n",
    "reranked_accuracy = sum([p['reranked_correct_position'] == 0 for p in os_predictions])/len(os_predictions)\n",
    "\n",
    "print(f'Accuracy without re-ranking: {raw_accuracy}')\n",
    "print(f'Accuracy with re-ranking: {reranked_accuracy}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "cf6fc44d-6af1-48b6-b859-01a1698c7dd9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 576 712\n",
      "3 887 1009\n",
      "5 948 1055\n",
      "10 1008 1082\n",
      "25 1073 1104\n",
      "50 1107 1107\n"
     ]
    }
   ],
   "source": [
    "# do recall @ 1, 3, 5, 10\n",
    "OPEN_SOURCE_RETRIEVAL = []\n",
    "OPEN_SOURCE_RETRIEVAL_PLUS_PRE_CE = []\n",
    "for k in (1, 3, 5, 10, 25, 50):\n",
    "    embedding_only_recall = os_predictions_df[os_predictions_df['retrieved_correct_position'] < k].shape[0]\n",
    "    reranked_recall = os_predictions_df[os_predictions_df['reranked_correct_position'] < k].shape[0]\n",
    "    print(k, embedding_only_recall, reranked_recall)\n",
    "    OPEN_SOURCE_RETRIEVAL.append(embedding_only_recall / os_predictions_df.shape[0])\n",
    "    OPEN_SOURCE_RETRIEVAL_PLUS_PRE_CE.append(reranked_recall / os_predictions_df.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "f733061c-eb98-40cb-b116-602e1c0dcd3e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3sAAAIjCAYAAAC6ZwLNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAADd0UlEQVR4nOzdd3wUZf7A8c+2bHpCOoHQEgWpQZDQ8RRBERQbxQacYMWGDVQELMfZODxF0bP+rID1TgVFFJUiKE269E56L1uf3x+b3WSTTbJpbEi+79crr+zOPDPzzOzM7Hz3aRqllEIIIYQQQgghRLOi9XUGhBBCCCGEEEI0PAn2hBBCCCGEEKIZkmBPCCGEEEIIIZohCfaEEEIIIYQQohmSYE8IIYQQQgghmiEJ9oQQQgghhBCiGZJgTwghhBBCCCGaIQn2hBBCCCGEEKIZkmBPCCGEEEIIIZohCfaaGI1Gw9y5c32djUZ14YUX0r179zOyLW+P59y5c9FoNG7TOnTowOTJkxsnY03chRdeyIUXXlinZVvycfMlT+fwmbJ69Wo0Gg2rV6/2yfbLW7FiBcnJyfj7+6PRaMjJyWHy5Ml06NDB11k7K9Tn2m9Mdrud7t2788wzz9R6WU/nZ1M/J5p6/qDpnitNhS8/w8OHD6PRaHjhhRd8sv3mzPldm5GR0WjbcH5+7777rmvazJkzSUlJqdP6mlywd+DAAW677TY6deqEv78/oaGhDBo0iJdeeoni4mJfZ08IIeqkqKiIuXPnNomAqLnKzMxk3LhxBAQEsGjRIt5//32CgoJ8mqd169Yxd+5ccnJyfJqPxmCz2XjnnXe48MILiYiIwGg00qFDB6ZMmcIff/zhSvfuu++i0Wiq/Pvtt99q3NbHH3/MsWPHmD59emPuUoOT694RFHr63C+99NJKaU0mE4888gjx8fEEBASQkpLCypUrfZDrhtcY58K3337b7AsIhMN9993Htm3b+O9//1vrZfWNkJ86++abb7juuuswGo3cfPPNdO/eHbPZzJo1a3jooYfYuXMnb7zxhq+z2aiKi4vR65vUx9Ji7d27F622yf0eIs5SRUVFzJs3D6BRfg1//PHHmTlzZoOv92zy+++/k5+fz1NPPcXw4cNd0//zn/9gt9t9kqd169Yxb948Jk+eTHh4uE/y0BiKi4u5+uqrWbFiBUOHDuXRRx8lIiKCw4cPs3TpUt577z2OHj1K27ZtXcs8+eSTdOzYsdK6kpKSatze888/z4QJEwgLC2vQ/Whsdb3ufXnONoa2bdsyf/58t2nx8fGV0k2ePJlPP/2U++67j3POOYd3332XUaNG8dNPPzF48OAzld1G0RjfAd9++y2LFi2SgK8FiIuL48orr+SFF17giiuuqNWyTSaqOHToEBMmTKB9+/b8+OOPtG7d2jXvrrvuYv/+/XzzzTc+zGHjsdvtmM1m/P398ff393V2RCmj0ejrLIgKJk+ezOHDh8/4r+RFRUUEBgae0W0WFhbWqlRKr9e3+B+K0tLSACoFVQaDwQe5ad4eeughVqxYwb/+9S/uu+8+t3lz5szhX//6V6VlLrvsMvr27VvrbW3ZsoVt27bx4osv1jW7DUYpRUlJCQEBAY2yfud139zO2bCwMG688cZq02zcuJFPPvmE559/ngcffBDA9cP/ww8/zLp162q9XV/cu4X3avs9563yz9XNybhx47juuus4ePAgnTp18nq5JlNs8dxzz1FQUMBbb73lFug5JSUlce+997reW61WnnrqKRITE11VRx599FFMJpPbch06dGD06NGsXr2avn37EhAQQI8ePVwPi59//jk9evTA39+fPn36sGXLFrflJ0+eTHBwMAcPHmTkyJEEBQURHx/Pk08+iVLKLe0LL7zAwIEDiYyMJCAggD59+vDpp59W2heNRsP06dP58MMP6datG0ajkRUrVrjmlf+Fxlk3eP/+/a5fhsPCwpgyZQpFRUVu6y0uLuaee+4hKiqKkJAQrrjiCk6cOOF1uzWTycScOXNISkrCaDSSkJDAww8/XOmYOvO/bNkyunbtSkBAAAMGDGD79u0AvP766yQlJeHv78+FF17I4cOHPW5v06ZNDBw4kICAADp27MjixYvrnCeTycT9999PdHS0a9+PHz/ucbtr1qzhggsuwN/fn8TERF5//XWP6Sq2PXNWRVq7di0zZswgOjqaoKAgrrrqKtLT092WtdvtzJ07l/j4eAIDA/nb3/7Grl27vGrPVr6u/aJFi+jUqROBgYGMGDGCY8eOoZTiqaeeom3btgQEBHDllVeSlZVVaT2vvvqq6/yKj4/nrrvu8liV7I033iAxMZGAgAD69evHr7/+6jFf3n4WFVksFubNm8c555yDv78/kZGRDB48+IxWzXG22VmyZAmPPvoocXFxBAUFccUVV3Ds2DG3tM42pZs2bWLo0KEEBgby6KOPAnU/BocPHyY6OhqAefPmuaoxOa9L533mwIEDjBo1ipCQEG644QYAfv31V6677jratWvn2ub9999fqVq7pzZ7zmv1yy+/pHv37hiNRrp16+a635R34sQJ/v73vxMbG+tK9/bbb1dKd/z4ccaOHUtQUBAxMTHcf//9Ne4/wKeffopGo+Hnn3+uNO/1119Ho9GwY8cOAE6fPs2UKVNo27YtRqOR1q1bc+WVV1Z5LwHH5zZp0iQALrjgAjQajetaq9h2pvw15jz/jUYjF1xwAb///nulde/Zs4drr72WiIgI/P396du3r1dVaebOnctDDz0EQMeOHV2f++HDhz22yXCqz/cAwAcffECfPn0ICAggIiKCCRMmVDrPwftrv6Ljx4/z+uuvc8kll1QK9AB0Oh0PPvigW6lefXz55Zf4+fkxdOhQt+lHjhzhzjvvpHPnzgQEBBAZGcl1111X7XlSW85niO+++871DOH8zsjJyeG+++4jISEBo9FIUlISzz77rKtErj7Xvaf2Xna7nYULF9KtWzf8/f2JjY3ltttuIzs725Vm9OjRVT4EDhgwoFKw3djnSnlWq5WCgoIq53/66afodDpuvfVW1zR/f39uueUW1q9f7zFf5TXEvXvlypUMHjyY8PBwgoOD6dy5s2sdUPYcUPEcq6ndck3nQl3ueZMnT2bRokUAbtVjK2qoe1xtnoGqym9V57s353Z1qnuuru2zuTfflxUdOXKEpKQkunfvTmpqKlDz/cHJ2a48LCyM8PBwJk2aVGW1f2eNla+++sqr4+LUZH4G/t///kenTp0YOHCgV+mnTp3Ke++9x7XXXssDDzzAhg0bmD9/Prt37+aLL75wS7t//36uv/56brvtNm688UZeeOEFxowZw+LFi3n00Ue58847AZg/fz7jxo2rVH3PZrNx6aWX0r9/f5577jlWrFjBnDlzsFqtPPnkk650L730EldccQU33HADZrOZTz75hOuuu46vv/6ayy+/3C1PP/74I0uXLmX69OlERUXV2Ih33LhxdOzYkfnz57N582befPNNYmJiePbZZ11pJk+ezNKlS7npppvo378/P//8c6XtVsVut3PFFVewZs0abr31Vs477zy2b9/Ov/71L/766y++/PJLt/S//vor//3vf7nrrrtcx2706NE8/PDDvPrqq9x5551kZ2fz3HPP8fe//50ff/zRbfns7GxGjRrFuHHjmDhxIkuXLuWOO+7Az8+Pv//977XO09SpU/nggw+4/vrrGThwID/++KPHfd++fTsjRowgOjqauXPnYrVamTNnDrGxsV4dJ4C7776bVq1aMWfOHA4fPszChQuZPn06S5YscaWZNWsWzz33HGPGjGHkyJFs27aNkSNHUlJS4vV2PvzwQ8xmM3fffTdZWVk899xzjBs3josuuojVq1fzyCOPsH//fl5++WUefPBBtwfzuXPnMm/ePIYPH84dd9zB3r17ee211/j9999Zu3at61fjt956i9tuu42BAwdy3333cfDgQa644goiIiJISEhwra+250d5c+fOZf78+UydOpV+/fqRl5fHH3/8webNm7nkkku8Ph4N4ZlnnkGj0fDII4+QlpbGwoULGT58OFu3bnX7pT4zM5PLLruMCRMmcOONNxIbG1uvYxAdHc1rr73GHXfcwVVXXcXVV18NQM+ePV1prFYrI0eOZPDgwbzwwguuX6OXLVtGUVERd9xxB5GRkWzcuJGXX36Z48ePs2zZshr3ec2aNXz++efceeedhISE8O9//5trrrmGo0ePEhkZCUBqair9+/d3fdlFR0ezfPlybrnlFvLy8lwP9MXFxVx88cUcPXqUe+65h/j4eN5///1K17cnl19+OcHBwSxdupRhw4a5zVuyZAndunVzddx0zTXXsHPnTu6++246dOhAWloaK1eu5OjRo1XeKx977DE6d+7MG2+84aoumJiYWG2ePvroI/Lz87ntttvQaDQ899xzXH311Rw8eNB1jezcuZNBgwbRpk0bZs6cSVBQEEuXLmXs2LF89tlnXHXVVVWu/+qrr+avv/7i448/5l//+hdRUVGA43zw5uGoIm++B5555hlmz57NuHHjmDp1Kunp6bz88ssMHTqULVu2uEo9vb32PVm+fDlWq5WbbrqpVvnPzc2t1KmBRqNxnYdVWbduHd27d69U2vX777+zbt06JkyYQNu2bTl8+DCvvfYaF154Ibt27WqwEp29e/cyceJEbrvtNqZNm0bnzp0pKipi2LBhnDhxgttuu4127dqxbt06Zs2axalTp1i4cGG9rntPbrvtNt59912mTJnCPffcw6FDh3jllVfYsmWL674+fvx4br75Zn7//XcuuOAC17JHjhzht99+4/nnn3dNOxPnitNff/1FUFAQZrOZ2NhYpk2bxhNPPOH2mW7ZsoVzzz2X0NBQt2X79esHwNatW2vcXn3u3Tt37mT06NH07NmTJ598EqPRyP79+1m7dq1X+1idms6FutzzbrvtNk6ePMnKlSt5//33PaZpjHucN89AVanqfPfm3K5JVc/VtXk29+b7sqIDBw5w0UUXERERwcqVK4mKivLq/gCOmgJXXnkla9as4fbbb+e8887jiy++cP1wWVFYWBiJiYmsXbuW+++/v8Zj4qKagNzcXAWoK6+80qv0W7duVYCaOnWq2/QHH3xQAerHH390TWvfvr0C1Lp161zTvvvuOwWogIAAdeTIEdf0119/XQHqp59+ck2bNGmSAtTdd9/tmma329Xll1+u/Pz8VHp6umt6UVGRW37MZrPq3r27uuiii9ymA0qr1aqdO3dW2jdAzZkzx/V+zpw5ClB///vf3dJdddVVKjIy0vV+06ZNClD33XefW7rJkydXWqcn77//vtJqterXX391m7548WIFqLVr17rl0Wg0qkOHDrmmOY9dXFycysvLc02fNWuWAtzSDhs2TAHqxRdfdE0zmUwqOTlZxcTEKLPZXKs8Oc+HO++80y3d9ddfX2nfx44dq/z9/d0+9127dimdTqcqXg7t27dXkyZNcr1/5513FKCGDx+u7Ha7a/r999+vdDqdysnJUUopdfr0aaXX69XYsWPd1jd37lwFuK3Tk0OHDilARUdHu9apVNmx7NWrl7JYLK7pEydOVH5+fqqkpEQppVRaWpry8/NTI0aMUDabzZXulVdeUYB6++23lVKO8zMmJkYlJycrk8nkSvfGG28oQA0bNsw1rTbnR8Xj1qtXL3X55ZdXu8/emjRpklu+vPXTTz8pQLVp08bt/Fy6dKkC1EsvveSa5jw/Fy9e7LaO2hwDT9LT06u8Fp33mZkzZ1aaV/G+opRS8+fPVxqNxu08dt4rygOUn5+f2r9/v2vatm3bFKBefvll17RbbrlFtW7dWmVkZLgtP2HCBBUWFubKw8KFCxWgli5d6kpTWFiokpKSKt07PZk4caKKiYlRVqvVNe3UqVNKq9WqJ598UimlVHZ2tgLU888/X+26PHFeo7///rvb9EmTJqn27du73juvscjISJWVleWa/tVXXylA/e9//3NNu/jii1WPHj1c15dSju+AgQMHqnPOOafGPD3//POV7oHl8/DOO+9UWqau3wOHDx9WOp1OPfPMM27ptm/frvR6vWt6ba59T+6//34FqC1btlSbzsn5uXj6MxqNNS7ftm1bdc0111Sa7unaWL9+vQLU//3f/7mmOa//it/t5c+JqjifIVasWOE2/amnnlJBQUHqr7/+cps+c+ZMpdPp1NGjR5VSdb/uK+bv119/VYD68MMP3dKtWLHCbXpubq4yGo3qgQcecEv33HPPud0zztS5opRSf//739XcuXPVZ599pv7v//5PXXHFFQpQ48aNc0vXrVu3Ss9LSim1c+dOj/fkiup77/7Xv/6lALfnuoqc53LF69mbc6yqc6E+97y77rqr0n1fqca5x3n7DFSVqs53b8/t6lT3XF2bZ3Nvvi+d9+P09HS1e/duFR8fry644AK34+zt/eHLL79UgHruuedcaaxWqxoyZEiV3w8jRoxQ5513Xo3HpLwmUY0zLy8PgJCQEK/Sf/vttwDMmDHDbfoDDzwAUKltX9euXRkwYIDrvbPr0osuuoh27dpVmn7w4MFK2yzfA5jz12+z2cwPP/zgml6+ZCA7O5vc3FyGDBnC5s2bK61v2LBhdO3atYY9LXP77be7vR8yZAiZmZmuY+csZnaWUjrdfffdXq1/2bJlnHfeeXTp0oWMjAzX30UXXQTATz/95Jb+4osvdvu1yXnsrrnmGrfPsapjqtfrue2221zv/fz8uO2220hLS2PTpk21ypPzfLjnnnvctlGxepHNZuO7775j7Nixbp/7eeedx8iRI704Sg633nqrW1WJIUOGYLPZOHLkCACrVq3CarXW+bNwuu6669w6I3AeyxtvvNGtbVZKSgpms5kTJ04A8MMPP2A2m7nvvvvcSqinTZtGaGio6/r4448/SEtL4/bbb8fPz8+VzlmdoLzanh/lhYeHs3PnTvbt21er/bfb7W7bysjIwGQyYbFYKk23WCxerfPmm292Oz+vvfZaWrdu7TqHnIxGI1OmTHGbVp9j4K077rij0rTy95XCwkIyMjIYOHAgSqlK1c49GT58uFsJV8+ePQkNDXVdk0opPvvsM8aMGYNSym3fRo4cSW5uruse9u2339K6dWuuvfZa1/oCAwPdql1VZ/z48aSlpblVdfr000+x2+2MHz/etb9+fn6sXr3a6yo8dTV+/HhatWrlej9kyBCg7H6VlZXFjz/+yLhx48jPz3cdl8zMTEaOHMm+fftc192ZUNP3wOeff47dbmfcuHFun2NcXBznnHOO6xytzbXvSW2/s50WLVrEypUr3f6WL19e43KZmZlun5NT+WvDYrGQmZlJUlIS4eHhHr9366pjx46VviOWLVvGkCFDaNWqlduxHj58ODabjV9++cXr9Xu67itatmwZYWFhXHLJJW7b69OnD8HBwa7PNjQ0lMsuu4ylS5e6NTVZsmQJ/fv3d333nalzBRwlg3PmzOHqq6/mpptu4quvvmLatGksXbrUrSfW4uJij23lne2uvOmRvT73bmdJ5ldffXVGO8dpzHteY9zjanoGqknF893bc7smVT1X1+bZvKbvy/J27NjBsGHD6NChAz/88IPbcfb2/vDtt9+i1+vdjolOp6v2edG5ztpoEtU4nUX2+fn5XqU/cuQIWq22Ug9ecXFxhIeHVzrhyj/YA64bVMXqAM7pFS82rVZbqQ78ueeeC+BWn/rrr7/m6aefZuvWrW71wD3VofbUI1l1Ku6D86TKzs4mNDTUdUwqrtebXs4A9u3bx+7du111yitydnxQVX5qe0zj4+MrNcotf0z79+/vdZ6c+16xylbnzp3d3qenp1NcXMw555xTaV2dO3eu9MBfleo+C2d+oPKxj4iI8PjA4u12vD3Gzu1X3H8/Pz86derkmu/8X/F4GAyGSud7bc+P8p588kmuvPJKzj33XLp3786ll17KTTfd5FaVyZOjR49WeZ1UzMdPP/3kVe9mFfdVo9GQlJRUqV1EmzZt3B5swPtjkJWVhdlsdk0PCAjw6qFIr9d7bON09OhRnnjiCf773/9Wuo5yc3NrXG/F8wgc56xzXenp6eTk5PDGG29U2dtx+WstKSmp0j2t4rlWlUsvvZSwsDCWLFnCxRdfDDgeQpOTk13Xv9Fo5Nlnn+WBBx4gNjaW/v37M3r0aG6++Wbi4uK82o63arqW9+/fj1KK2bNnM3v2bI/rSEtLIy4urlK1zIiIiErnUGPmNzQ0lH379qGU8niPg7KOampz7XtS2+9sp379+tWpgxagUht5cDz8z58/n3feeYcTJ064pfHm2vCWp/vQvn37+PPPP+t0Tyyvquve0/Zyc3OJiYmpcXvjx4/nyy+/ZP369QwcOJADBw6wadMmV9Ux5/rOxLlSlQceeID//Oc//PDDD/Tv3x9w3Cs9tf91Nn/wplOc+ty7x48fz5tvvsnUqVOZOXMmF198MVdffTXXXntto/bM3Zj3vIa6x7Vp08brdVbH0/nu7bmdm5vrFvD7+fkRERHhel/V80Jtns1r+r4sb8yYMcTGxvLdd98RHBxcaZ+8uT8cOXKE1q1bV1q+uu9UpVStx9RtMsFefHy8q3G+t7zdWZ1OV6vpnr5UavLrr79yxRVXMHToUF599VVat26NwWDgnXfe4aOPPqqUvrY9eTVkXj2x2+306NGDBQsWeJxfMcA4E8e0tnk6Uxr7s6hpO2dq++XV57MYOnQoBw4c4KuvvuL777/nzTff5F//+heLFy9m6tSpVS4XFxdXqROX559/ntOnT1fqla9Xr1612Juaebo+vT0GV199tVsnJJMmTfLYCUdFRqOx0gOFzWbjkksuISsri0ceeYQuXboQFBTEiRMnmDx5sle/Ptd0vjjXceONN1bZTqCmwNxbRqORsWPH8sUXX/Dqq6+SmprK2rVr+cc//uGW7r777mPMmDF8+eWXfPfdd8yePZv58+fz448/0rt37wbJC3h/bB588MEqS/+TkpI4duxYpQeNmn6AqOr7y2az1Su/Go2G5cuXe0xb8YGirrp06QI42kAnJyc3yDqrExkZ6fFh6+677+add97hvvvuY8CAAYSFhaHRaJgwYUKDlsxUdT+45JJLePjhhz0u4/zxoiaerntP7HY7MTExfPjhhx7nl3+oHDNmDIGBgSxdupSBAweydOlStFot1113ndv6zsS5UhXn/bJ852KtW7f2WFJ+6tQpwPNQDRXV594dEBDAL7/8wk8//cQ333zDihUrWLJkCRdddBHff/89Op2uTtetNxrrntdQ97jarLM6ns53b8/te++9l/fee881fdiwYW61RDx99rV9Nq/Nvl1zzTW89957fPjhh2411Zz71BD3B0+ys7Nd7b+91SSCPXD0IPXGG2+wfv16tyqXnrRv3x673c6+ffs477zzXNNTU1PJycmhffv2DZo3u93OwYMH3T6cv/76C8BVlfGzzz7D39+f7777zq0awjvvvNOgeamK85gcOnTI7Re4/fv3e7V8YmIi27Zt4+KLL671LwZ1cfLkyUpd7lY8pt7mybnvBw4ccPs1ZO/evW7poqOjCQgI8FidsGLa+nCef/v373d7AMzMzGz0amnlt7937163X17NZjOHDh1y9ebkTLdv3z5XdRZwVIc6dOiQWwBV3/MjIiKCKVOmMGXKFAoKChg6dChz586tNtjz9/d3GysNHD3HmUymStO9VfGzV0qxf/9+r4IZb4/Biy++6PY5Ox9Q6nLctm/fzl9//cV7773HzTff7JrekD2ZOnuwtdlsNR7X9u3bs2PHjkq/LNbm+hk/fjzvvfceq1atYvfu3SilXFU4y0tMTOSBBx7ggQceYN++fSQnJ/Piiy/ywQcfeL9z9eS8fgwGQ7XHxmAwVPpMnNdPVZ+789fwir2ueVsVypPExESUUnTs2LHah4naXPueXHbZZeh0Oj744INad9JSF126dOHQoUOVpn/66adMmjTJ7cefkpKSMzKAfWJiIgUFBTVeMw31fZqYmMgPP/zAoEGDavyxOCgoiNGjR7Ns2TIWLFjAkiVLGDJkiFuwdKbOlao4q8WVD1KTk5P56aefyMvLc+ukZcOGDa75dVGb7y+tVsvFF1/MxRdfzIIFC/jHP/7BY489xk8//cTw4cPrdd3WtO263PPqe355e49rTN6e2w8//LDb8B3e1JRqzGfz559/Hr1e7+rM5frrr3fN8/b+0L59e1atWkVBQYHbDyzVfafW5bprEm32wPEhBgUFMXXqVFe3peUdOHCAl156CYBRo0YBuFVJAFy/2njbA2VtvPLKK67XSileeeUVDAaDqyqS8xef8r/uHD58uNoe+hqS8xeZV1991W36yy+/7NXy48aN48SJE/znP/+pNK+4uJjCwsL6Z7Icq9XqNuSB2Wzm9ddfJzo6mj59+tQqT5dddhkA//73v93SVDw/dDodI0eO5Msvv+To0aOu6bt37+a7775rkP0CR3tGvV7Pa6+95ja9/DnUmIYPH46fnx///ve/3X6Neuutt8jNzXVdH3379iU6OprFixe7VTt89913K32R1ef8yMzMdHsfHBxMUlKSV931N7T/+7//c6t69umnn3Lq1CnXOVQdb49Bnz59GD58uOvP2YbA2etYbR5Enb8ylv8clVKue2FD0Ol0XHPNNXz22Wcea1eUr544atQoTp486dZtdVFRUZXVPz0ZPnw4ERERLFmyhCVLltCvXz+3H0WKiooq9VqbmJhISEjIGT9nYmJiuPDCC3n99dddpQvlOY+N84eJ8n/O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LERERERE9QbDnhFT3LoFADDXchgnF2chIiIiIqo/GPaMGHv2iIiIiIioIgx7RqokJwclWVkAtA97abmlPXtutgx7RERERESmjmHPSKlW4pQ6OEBqa6vVNephnFyghYiIiIjI5DHsGSnF7b/m62nZq1dUUoR7+fcAsGePiIiIiKg+YNgzUopbus3XU227YCm1RAOLBnqri4iIiIiI6gaGPSOlXpzF01Or81Xz9eQ2cgiCoLe6iIiIiIiobmDYM1KKOzquxJlTOseP2y4QEREREdUPDHtGqki97YJ24U29Eie3XSAiIiIiqhcY9oyUrnP22LNHRERERFS/MOwZoZLsbCizswEAMl332GPPHhERERFRvcCwZ4QUd/7aY69BA0hsbLS6hmGPiIiIiKh+YdgzQuqVOLXs1VOKSvXWCxzGSURERERUPzDsGSHFLd02VL+ffx8KpQJSQQpXa1d9lkZERERERHUEw54RKtKxZ0+1OIurtSvMJGZ6q4uIiIiIiOoOhj0jpLhdGt7MPbULe6ohnJyvR0RERERUfzDsGSHVnD1tV+K8k1saDt1sGfaIiIiIiOoLhj0jpOsCLeo99my4OAsRERERUX3BsGdkSrKyoHz8GABg7q5deFNvu8CePSIiIiKieoNhz8ioevWkTk6QWFtrdY0q7LFnj4iIiIio/mDYMzLqlTg9PbW+Ji2HG6oTEREREdU3DHtG5u/5etr10mUXZSNHkQMAkNvI9VYXERERERHVLQx7RkZxS7eVOFW9eg0sGsDaXLthn0REREREZPwY9oxMdVfi5OIsRERERET1C8OekVHoOGdPvRIn5+sREREREdUrDHtGRBRFnXv2GPaIiIiIiOonhj0joszKgjI3F4D2e+ypN1S35bYLRERERET1CcOeESn6a3EWacOGkFhaanUN99gjIiIiIqqfGPaMiK7bLgB/hz25LbddICIiIiKqTxj2jIgq7Mk8tFucpbCkEPfz7wNgzx4RERERUX3DsGdEdF2cJT03HQBgZWYFRwtHfZVFRERERER1EMOeEVHcugWgGnvs2bhBEAS91UVERERERHUPw54RUdypXs8eN1QnIiIiIqp/GPaMhCiKKLpd2lNn7qllz17u3z17RERERERUvzDsGQllZibEvDwA1dhjj4uzEBERERHVOwx7RkJxpzS4mbm4QGJhodU1qm0XOIyT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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "X = [1, 3, 5, 10, 25, 50]\n",
    "\n",
    "OPENAI_RETRIEVAL = [866 / os_predictions_df.shape[0], 1009/ os_predictions_df.shape[0], 1048/ os_predictions_df.shape[0], 1072/ os_predictions_df.shape[0], 1108/ os_predictions_df.shape[0], 1122/ os_predictions_df.shape[0]]\n",
    "OLD_CROSS_ENCODER = [956 / os_predictions_df.shape[0], 1057/ os_predictions_df.shape[0], 1077/ os_predictions_df.shape[0], 1094/ os_predictions_df.shape[0], 1120/ os_predictions_df.shape[0], 1122/ os_predictions_df.shape[0]]\n",
    "\n",
    "# Creating the plot\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.plot(X, OPENAI_RETRIEVAL, label='OAI Retrieval Only', marker='o')\n",
    "plt.plot(X, OLD_CROSS_ENCODER, label='OAI + Pretrained CE', marker='s')\n",
    "\n",
    "plt.plot(X, OPEN_SOURCE_RETRIEVAL, label='OS Retrieval Only', marker='*')\n",
    "plt.plot(X, OPEN_SOURCE_RETRIEVAL_PLUS_PRE_CE, label='OS + Pretrained CE', marker='^')\n",
    "\n",
    "\n",
    "# Adding titles and labels\n",
    "plt.title('Comparing embedding models + pre-trained vs fine-tuned CE (all retrieved 50 results then re-ranked)')\n",
    "plt.xlabel('Recall @')\n",
    "plt.ylabel('Performance')\n",
    "plt.xticks(X)\n",
    "plt.yticks([i/100 for i in range(70, 101, 5)])  # Adjusting y-ticks to start from 0.75\n",
    "\n",
    "# Adding legend\n",
    "plt.legend()\n",
    "\n",
    "# Show the plot\n",
    "plt.grid(True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "097fe3bc-4fc1-4e69-bf60-6ab4f75da968",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f11e5dcd-7ad8-43d0-aa1b-2b94b3784253",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "06e3a30f-e913-43ad-9fa7-f712abfa59d0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91e6c207-7f75-4b04-8d32-541265902fa5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9ec04ddb-5a7d-4506-a0ba-a3ddedf985df",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "30c5cb27-018c-4299-a91f-6b39293c583e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c3200a66-9fc0-4f39-94e8-3456b85b6a96",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "ea30153c",
   "metadata": {
    "id": "ea30153c"
   },
   "source": [
    "## Advanced: Fine-tuning the re-ranker"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58979a1e-0fe1-488f-9805-56efd499278d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "508edaf6",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "508edaf6",
    "outputId": "1938803f-c8bd-478b-a37c-3a3894e1c106"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'id': 'a4968ca8a18de16aa3859be760e43dbd3af3fce9',\n",
       " 'title': 'Area 51',\n",
       " 'context': 'In 1994, five unnamed civilian contractors and the widows of contractors Walter Kasza and Robert Frost sued the USAF and the United States Environmental Protection Agency. Their suit, in which they were represented by George Washington University law professor Jonathan Turley, alleged they had been present when large quantities of unknown chemicals had been burned in open pits and trenches at Groom. Biopsies taken from the complainants were analyzed by Rutgers University biochemists, who found high levels of dioxin, dibenzofuran, and trichloroethylene in their body fat. The complainants alleged they had sustained skin, liver, and respiratory injuries due to their work at Groom, and that this had contributed to the deaths of Frost and Kasza. The suit sought compensation for the injuries they had sustained, claiming the USAF had illegally handled toxic materials, and that the EPA had failed in its duty to enforce the Resource Conservation and Recovery Act (which governs handling of dangerous materials). They also sought detailed information about the chemicals to which they were allegedly exposed, hoping this would facilitate the medical treatment of survivors. Congressman Lee H. Hamilton, former chairman of the House Intelligence Committee, told 60 Minutes reporter Lesley Stahl, \"The Air Force is classifying all information about Area 51 in order to protect themselves from a lawsuit.\"',\n",
       " 'question': 'Who analyzed the biopsies?',\n",
       " 'answers': {'answer_start': [457],\n",
       "  'text': ['Rutgers University biochemists']}}"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset['train'][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "51bf1607",
   "metadata": {
    "id": "51bf1607"
   },
   "outputs": [],
   "source": [
    "from sentence_transformers import InputExample, losses, evaluation\n",
    "from torch.utils.data import DataLoader\n",
    "from random import shuffle\n",
    "\n",
    "shuffled_training_passages = dataset['train']['question'].copy()\n",
    "shuffle(shuffled_training_passages)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b58d2d0",
   "metadata": {
    "id": "6b58d2d0"
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "50fd5c19-894a-41e4-bf6f-d9e1197c053f",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "50fd5c19-894a-41e4-bf6f-d9e1197c053f",
    "outputId": "8501a6c6-548c-4928-ecb7-4ed99339063b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9916, 11590)"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unique_train_passages = list(set(dataset['train']['context']))\n",
    "len(unique_train_passages), len(dataset['train']['context'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ce8e076e-4822-4686-b57a-b8c0e09583e5",
   "metadata": {
    "id": "ce8e076e-4822-4686-b57a-b8c0e09583e5"
   },
   "outputs": [],
   "source": [
    "from sentence_transformers import SentenceTransformer\n",
    "\n",
    "# We will use this embedder to find negative examples\n",
    "bi_encoder = SentenceTransformer(\"sentence-transformers/msmarco-MiniLM-L-6-v3\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c4ae6f1f-0523-40ff-8d5d-f374e4ead044",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 49,
     "referenced_widgets": [
      "dbca2d7da970438892d45cd387434f6f",
      "6f5389fdc3674a05ad79bb9456a5995f",
      "7a5c511f2fe84c66beef7fed87023669",
      "70e45cb4f2f64c499acc785ec64743fe",
      "bb260568c96a4397bba2b1058404eec2",
      "e281ca37b72d422285aa64193265aaa4",
      "687d7bf7373f4541852203637e18d2e3",
      "5a7b319329164b27bf452869e2335aef",
      "e5a88639e7e5430fbe44f73d2e5a4b23",
      "d9f6781147a24bc3aec97b87927bdfbb",
      "d0c85ebbf1a54fdcaa33210aa3e247b8"
     ]
    },
    "id": "c4ae6f1f-0523-40ff-8d5d-f374e4ead044",
    "outputId": "847007cf-bf2e-4d3a-a10f-fd84123c1eb0"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "dbca2d7da970438892d45cd387434f6f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Batches:   0%|          | 0/620 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "embeddings = bi_encoder.encode(\n",
    "    unique_train_passages,\n",
    "    show_progress_bar=True,\n",
    "    batch_size=16,\n",
    "    normalize_embeddings=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5eaad504-b944-4e36-987f-34126189c1a9",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "5eaad504-b944-4e36-987f-34126189c1a9",
    "outputId": "ac4a626c-862b-4676-f177-4b3c477d93c1"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9916, (9916, 384))"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(unique_train_passages), embeddings.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "361d5ef0-3fe3-4ed8-87c0-1cea3d9abcc2",
   "metadata": {
    "id": "361d5ef0-3fe3-4ed8-87c0-1cea3d9abcc2",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# use sentence_transformers.util.semantic_search\n",
    "from sentence_transformers.util import semantic_search\n",
    "\n",
    "unique_train_passages = np.array(unique_train_passages)\n",
    "\n",
    "# Function to find most similar document\n",
    "def find_most_similar(text, embeddings, documents, k=3):\n",
    "    query_embedding = bi_encoder.encode([text], show_progress_bar=False)\n",
    "    similarities = semantic_search(query_embedding, embeddings, top_k=k)\n",
    "    return [(documents[sim['corpus_id']], sim['score'], sim['corpus_id']) for sim in similarities[0]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c7d79fe9-f053-40e7-a2e6-2efd715b43f7",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "c7d79fe9-f053-40e7-a2e6-2efd715b43f7",
    "outputId": "5112eaae-cf89-4779-a87c-dcd03750798c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The ancient Egyptians engaged in trade with their foreign neighbors to obtain rare, exotic goods not found in Egypt. In the Predynastic Period, they established trade with Nubia to obtain gold and incense. They also established trade with Palestine, as evidenced by Palestinian-style oil jugs found in the burials of the First Dynasty pharaohs. An Egyptian colony stationed in southern Canaan dates to slightly before the First Dynasty. Narmer had Egyptian pottery produced in Canaan and exported back to Egypt.By the Second Dynasty at latest, ancient Egyptian trade with Byblos yielded a critical source of quality timber not found in Egypt. By the Fifth Dynasty, trade with Punt provided gold, aromatic resins, ebony, ivory, and wild animals such as monkeys and baboons. Egypt relied on trade with Anatolia for essential quantities of tin as well as supplementary supplies of copper, both metals being necessary for the manufacture of bronze. The ancient Egyptians prized the blue stone lapis lazuli, which had to be imported from far-away Afghanistan. Egypt's Mediterranean trade partners also included Greece and Crete, which provided, among other goods, supplies of olive oil. In exchange for its luxury imports and raw materials, Egypt mainly exported grain, gold, linen, and papyrus, in addition to other finished goods including glass and stone objects.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[(\"The ancient Egyptians engaged in trade with their foreign neighbors to obtain rare, exotic goods not found in Egypt. In the Predynastic Period, they established trade with Nubia to obtain gold and incense. They also established trade with Palestine, as evidenced by Palestinian-style oil jugs found in the burials of the First Dynasty pharaohs. An Egyptian colony stationed in southern Canaan dates to slightly before the First Dynasty. Narmer had Egyptian pottery produced in Canaan and exported back to Egypt.By the Second Dynasty at latest, ancient Egyptian trade with Byblos yielded a critical source of quality timber not found in Egypt. By the Fifth Dynasty, trade with Punt provided gold, aromatic resins, ebony, ivory, and wild animals such as monkeys and baboons. Egypt relied on trade with Anatolia for essential quantities of tin as well as supplementary supplies of copper, both metals being necessary for the manufacture of bronze. The ancient Egyptians prized the blue stone lapis lazuli, which had to be imported from far-away Afghanistan. Egypt's Mediterranean trade partners also included Greece and Crete, which provided, among other goods, supplies of olive oil. In exchange for its luxury imports and raw materials, Egypt mainly exported grain, gold, linen, and papyrus, in addition to other finished goods including glass and stone objects.\",\n",
       "  1.0,\n",
       "  0),\n",
       " ('Egypt is rich in building and decorative stone, copper and lead ores, gold, and semiprecious stones. These natural resources allowed the ancient Egyptians to build monuments, sculpt statues, make tools, and fashion jewelry. Embalmers used salts from the Wadi Natrun for mummification, which also provided the gypsum needed to make plaster. Ore-bearing rock formations were found in distant, inhospitable wadis in the eastern desert and the Sinai, requiring large, state-controlled expeditions to obtain natural resources found there. There were extensive gold mines in Nubia, and one of the first maps known is of a gold mine in this region. The Wadi Hammamat was a notable source of granite, greywacke, and gold. Flint was the first mineral collected and used to make tools, and flint handaxes are the earliest pieces of evidence of habitation in the Nile valley. Nodules of the mineral were carefully flaked to make blades and arrowheads of moderate hardness and durability even after copper was adopted for this purpose. Ancient Egyptians were among the first to use minerals such as sulfur as cosmetic substances.The Egyptians worked deposits of the lead ore galena at Gebel Rosas to make net sinkers, plumb bobs, and small figurines. Copper was the most important metal for toolmaking in ancient Egypt and was smelted in furnaces from malachite ore mined in the Sinai. Workers collected gold by washing the nuggets out of sediment in alluvial deposits, or by the more labor-intensive process of grinding and washing gold-bearing quartzite. Iron deposits found in upper Egypt were utilized in the Late Period. High-quality building stones were abundant in Egypt; the ancient Egyptians quarried limestone all along the Nile valley, granite from Aswan, and basalt and sandstone from the wadis of the eastern desert. Deposits of decorative stones such as porphyry, greywacke, alabaster, and carnelian dotted the eastern desert and were collected even before the First Dynasty. In the Ptolemaic and Roman Periods, miners worked deposits of emeralds in Wadi Sikait and amethyst in Wadi el-Hudi.',\n",
       "  0.7423145174980164,\n",
       "  1393),\n",
       " ('The ancient Egyptians viewed men and women, including people from all social classes except slaves, as essentially equal under the law, and even the lowliest peasant was entitled to petition the vizier and his court for redress. Although slaves were mostly used as indentured servants, they were able to buy and sell their servitude, work their way to freedom or nobility, and were usually treated by doctors in the workplace. Both men and women had the right to own and sell property, make contracts, marry and divorce, receive inheritance, and pursue legal disputes in court. Married couples could own property jointly and protect themselves from divorce by agreeing to marriage contracts, which stipulated the financial obligations of the husband to his wife and children should the marriage end. Compared with their counterparts in ancient Greece, Rome, and even more modern places around the world, ancient Egyptian women had a greater range of personal choices and opportunities for achievement. Women such as Hatshepsut and Cleopatra VII even became pharaohs, while others wielded power as Divine Wives of Amun. Despite these freedoms, ancient Egyptian women did not often take part in official roles in the administration, served only secondary roles in the temples, and were not as likely to be as educated as men.',\n",
       "  0.6631918549537659,\n",
       "  1693)]"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Example usage\n",
    "input_text = unique_train_passages[0]\n",
    "print(input_text)\n",
    "\n",
    "find_most_similar(input_text, embeddings, unique_train_passages)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "262e4ca4-0bfe-4243-9534-49370ed66b40",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "262e4ca4-0bfe-4243-9534-49370ed66b40",
    "outputId": "79506047-cc55-4163-e4c4-85274f0622f0"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 11590/11590 [01:54<00:00, 100.86it/s]\n"
     ]
    }
   ],
   "source": [
    "# add some negative examples\n",
    "train_samples = []\n",
    "\n",
    "for train_example in tqdm(dataset['train']):\n",
    "    for i, (passage, score, corpus_idx) in enumerate(find_most_similar(train_example['question'], embeddings, unique_train_passages)):\n",
    "        train_samples.append(\n",
    "            InputExample(\n",
    "                texts=[train_example['question'], passage], label=1 if i == 0 else 0\n",
    "            )\n",
    "        )\n",
    "\n",
    "shuffle(train_samples)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b281241b-54ed-4405-a101-f774efd2317d",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "b281241b-54ed-4405-a101-f774efd2317d",
    "outputId": "649df482-1761-4ba9-c20d-4364e037e2b0"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "34770"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_samples)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8e7eaa40",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "8e7eaa40",
    "outputId": "2d1ab8ba-9f2e-4b24-b104-baf10d58e45f"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'guid': '',\n",
       " 'texts': ['How was Mike Leander also known as?',\n",
       "  \"Günter Theodor Netzer (born 14 September 1944 in Mönchengladbach) is a former German football player and team general manager currently working in the media business. He achieved great success in Germany with Borussia Mönchengladbach in the early 1970s, and, after moving to Spain in 1973, with Real Madrid. He played as an attacking midfielder, and is considered one of the greatest passers in the game's history. He was voted Footballer of the Year in Germany twice, in 1972 and 1973. He was the general manager for Hamburger SV during much of the team's golden period from the late 1970s through the early 1980s, when the club won three league titles and the 1983 European Cup.\"],\n",
       " 'label': 0}"
      ]
     },
     "execution_count": 204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_samples[0].__dict__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bc2bc9d1",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "bc2bc9d1",
    "outputId": "97ead4f4-bce2-4e8b-d379-1baab6ddd641"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Warmup-steps: 174\n"
     ]
    }
   ],
   "source": [
    "from sentence_transformers.cross_encoder.evaluation import CECorrelationEvaluator, CEBinaryClassificationEvaluator\n",
    "import math\n",
    "import torch\n",
    "from random import sample\n",
    "\n",
    "logger.setLevel(logging.DEBUG)  # just to get some logs\n",
    "\n",
    "num_epochs = 1\n",
    "\n",
    "model_save_path = './fine_tuned_ir_cross_encoder'\n",
    "\n",
    "train_dataloader = DataLoader(train_samples[:int(len(train_samples)*.8)], shuffle=True, batch_size=16)\n",
    "\n",
    "# An evaluator for training performance\n",
    "evaluator = CECorrelationEvaluator.from_input_examples(train_samples[int(len(train_samples)*.8):], name='test')\n",
    "\n",
    "# Rule of thumb for warmup steps\n",
    "warmup_steps = math.ceil(len(train_dataloader) * num_epochs * 0.1)  # 10% of train data for warm-up\n",
    "print(f\"Warmup-steps: {warmup_steps}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ce4e8079-1335-4d53-944d-3ed0f6537781",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 137,
     "referenced_widgets": [
      "f36d8f08f6284b848622fd560196cc78",
      "608d1345487046ceb64b0b31a4287ae0",
      "43c8db4be4984f6da1540de6bc89b616",
      "6cb81ad9ee8141aa9d0fbefc276f244d",
      "8e989ddf9d274876a3ba06056e7147a1",
      "fce9aa1662c34941afadd6141aba9180",
      "098016d32abc4f45be0a4f747cbc3f11",
      "dc26c84713fb45f5a6c5b870c96d9d9e",
      "a6ac9d7aed4c493db567b015ab8502a5",
      "80e18075a957476591fa1ba2585b7a73",
      "e1d8ec56e5614d77a6999a42283be94b",
      "21316ef8a22d40ab9109ccf0fa7fa645",
      "458bcab796d642c9afd2e534085b991f",
      "266b42f10bd74b9f907588c1251c8d6c",
      "ba968ae891a2400fa0db9f331b85b66c",
      "5d09ef7e47f446a3a3a51458195a0fe3",
      "352af51e6e7943a7a41d3bbe41885d8d",
      "2cb4c1bff01b4f669ecd8583187bab9f",
      "b070922627a04195a41899a169984b08",
      "85a67e7f5d2845329d63f0922bb5d9a6",
      "5b3c84192618410ea1793239c4514c6e",
      "7bd0527b8e174aec9911c5b32dc048fd"
     ]
    },
    "id": "ce4e8079-1335-4d53-944d-3ed0f6537781",
    "outputId": "446b8d35-7bc9-48d5-c9ab-60dc6b3762fc"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f36d8f08f6284b848622fd560196cc78",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Batches:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'guid': '', 'texts': ['What can be inferred about Zionism?', 'Determines that Zionism is a form of racism and racial discrimination.'], 'label': 1} 0.9391304\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "21316ef8a22d40ab9109ccf0fa7fa645",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Batches:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'guid': '', 'texts': ['How was Mike Leander also known as?', \"Günter Theodor Netzer (born 14 September 1944 in Mönchengladbach) is a former German football player and team general manager currently working in the media business. He achieved great success in Germany with Borussia Mönchengladbach in the early 1970s, and, after moving to Spain in 1973, with Real Madrid. He played as an attacking midfielder, and is considered one of the greatest passers in the game's history. He was voted Footballer of the Year in Germany twice, in 1972 and 1973. He was the general manager for Hamburger SV during much of the team's golden period from the late 1970s through the early 1980s, when the club won three league titles and the 1983 European Cup.\"], 'label': 0} 0.00016999716\n"
     ]
    }
   ],
   "source": [
    "for t in train_samples:\n",
    "    if t.label == 1:\n",
    "        print(t.__dict__, cross_encoder.predict(t.texts, activation_fct=nn.Sigmoid()))\n",
    "        break\n",
    "for t in train_samples:\n",
    "    if t.label == 0:\n",
    "        print(t.__dict__, cross_encoder.predict(t.texts, activation_fct=nn.Sigmoid()))\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f981bd03-bb31-492d-aabf-d5e6c7647704",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "f981bd03-bb31-492d-aabf-d5e6c7647704",
    "outputId": "f918fbbb-80b1-44b5-eee7-219d4e632dc7"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.3844874561927453"
      ]
     },
     "execution_count": 251,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluator(cross_encoder)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0de4dbc8",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 81,
     "referenced_widgets": [
      "e31ae00bfabe4ed5b058d7dbe55a80f6",
      "b9fbabd33a2a4d0a94055cd086d83228",
      "b281e2a5a8204b52827f01316d637952",
      "cdd38d9a948a4a4c8408dcb06d7c584a",
      "b86aa89087cb425198afa2db30d86600",
      "168948926c2340abb8b52f8dd67a5e73",
      "8396e1788d5540a79a9d195e2753351a",
      "084ebc36eb9d4616acc1a0843673ac4f",
      "252dfe4d46604a089c263bb0eae17a3a",
      "2aa32422748943759daf5ef05077bda0",
      "e7c672eb19574b32811bdcc3f6ac0b34",
      "37395cf0cac548c783ccbdac230c4a3c",
      "8085fe243d814d5da2b4d6b665a6aa51",
      "0295736b3f254a8590d911792f2c19db",
      "ad079ced956841be88a3ab6f2fdcd88d",
      "953b16307b514bc995efc40ff8f4698b",
      "4d26773cf0ec45fc9ac3185f8141cfe6",
      "d7959d1933e5466095bed23bb268afd5",
      "3f1ba16f17c94fb8a409d152b9a6045a",
      "c485139a148e4207957e96b4275eeed2",
      "6f96c8a415744597bcaa83141b3a457c",
      "8e41a0a7932b4f0b8a448847ff3f14ff"
     ]
    },
    "id": "0de4dbc8",
    "outputId": "1190bca8-f5ae-4907-cd50-1d6771ef1e22"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e31ae00bfabe4ed5b058d7dbe55a80f6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Epoch:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "37395cf0cac548c783ccbdac230c4a3c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Iteration:   0%|          | 0/1739 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Train the model\n",
    "from sentence_transformers import InputExample, losses, evaluation\n",
    "\n",
    "# you may turn on debug for more logs here e.g. logger.setLevel(logging.DEBUG)\n",
    "cross_encoder.fit(\n",
    "    train_dataloader=train_dataloader,\n",
    "    loss_fct=nn.BCEWithLogitsLoss(),  # this is the default loss if num_labels is 1 otherwise CrossEntropyLoss\n",
    "    evaluator=evaluator,\n",
    "    epochs=num_epochs,\n",
    "    warmup_steps=warmup_steps,\n",
    "    output_path=model_save_path,\n",
    "    use_amp=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9_a5R9sVBvHN",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "9_a5R9sVBvHN",
    "outputId": "fdba13f3-8eaa-4bf8-8056-3168674bd0a8"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.42047041059290036"
      ]
     },
     "execution_count": 260,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluator(cross_encoder)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2f747537",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "2f747537",
    "outputId": "bb2caf80-5b00-4f57-aaf0-245fc586ef5f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9973792\n",
      "5.941634\n"
     ]
    }
   ],
   "source": [
    "finetuned = CrossEncoder(model_save_path)\n",
    "\n",
    "print(finetuned.predict(['hello', 'hi'], activation_fct=nn.Sigmoid()))\n",
    "print(finetuned.predict(['hello', 'hi'], activation_fct=nn.Identity()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "KGSvctdu4pRR",
   "metadata": {
    "id": "KGSvctdu4pRR"
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "94cf736e",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "94cf736e",
    "outputId": "28ee86d1-ada9-44d5-9fde-eaede674f0ac",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  9%|▊         | 100/1148 [02:38<27:50,  1.59s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.78\n",
      "Accuracy with re-ranking: 0.84\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 17%|█▋        | 200/1148 [05:18<26:10,  1.66s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.765\n",
      "Accuracy with re-ranking: 0.84\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 26%|██▌       | 300/1148 [07:57<22:00,  1.56s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7666666666666667\n",
      "Accuracy with re-ranking: 0.8266666666666667\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 35%|███▍      | 400/1148 [10:37<19:44,  1.58s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7625\n",
      "Accuracy with re-ranking: 0.84\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 44%|████▎     | 500/1148 [13:17<17:16,  1.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.764\n",
      "Accuracy with re-ranking: 0.85\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 52%|█████▏    | 600/1148 [16:00<14:35,  1.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7683333333333333\n",
      "Accuracy with re-ranking: 0.8566666666666667\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 61%|██████    | 700/1148 [18:40<12:28,  1.67s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7471428571428571\n",
      "Accuracy with re-ranking: 0.8428571428571429\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 70%|██████▉   | 800/1148 [21:21<09:13,  1.59s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.74875\n",
      "Accuracy with re-ranking: 0.835\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 78%|███████▊  | 900/1148 [25:36<06:43,  1.63s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7388888888888889\n",
      "Accuracy with re-ranking: 0.8333333333333334\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 87%|████████▋ | 1000/1148 [28:16<04:00,  1.62s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.741\n",
      "Accuracy with re-ranking: 0.835\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 96%|█████████▌| 1100/1148 [30:57<01:16,  1.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7509090909090909\n",
      "Accuracy with re-ranking: 0.8436363636363636\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1148/1148 [32:14<00:00,  1.68s/it]\n"
     ]
    }
   ],
   "source": [
    "logger.setLevel(logging.CRITICAL)\n",
    "\n",
    "ft_predictions = []\n",
    "\n",
    "for question in tqdm(test_sample['question']):\n",
    "    r = get_results_from_pinecone(\n",
    "        question, top_k=TOP_K, re_rank_model=finetuned, correct_hash=q_to_hash[question],\n",
    "        verbose=False\n",
    "        )\n",
    "\n",
    "    r['retrieved_correct_position'], r['reranked_correct_position']\n",
    "    ft_predictions.append(r)\n",
    "    if len(ft_predictions) % 100 == 0:\n",
    "        retrieved_accuracy = sum([_['retrieved_correct_position'] == 0 for _ in ft_predictions])/len(ft_predictions)\n",
    "        re_ranked_accuracy = sum([_['reranked_correct_position'] == 0 for _ in ft_predictions])/len(ft_predictions)\n",
    "\n",
    "        print(f'Accuracy without re-ranking: {retrieved_accuracy}')\n",
    "        print(f'Accuracy with re-ranking: {re_ranked_accuracy}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a07b782d-ef97-4c0a-be53-aefea5936676",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "a07b782d-ef97-4c0a-be53-aefea5936676",
    "outputId": "b4daa149-efbf-4383-c233-ccd7b2bcfc17"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.7543554006968641\n",
      "Accuracy with re-ranking: 0.8493031358885017\n"
     ]
    }
   ],
   "source": [
    "retrieved_accuracy = sum([_['retrieved_correct_position'] == 0 for _ in ft_predictions])/len(ft_predictions)\n",
    "re_ranked_accuracy = sum([_['reranked_correct_position'] == 0 for _ in ft_predictions])/len(ft_predictions)\n",
    "\n",
    "print(f'Accuracy without re-ranking: {retrieved_accuracy}')\n",
    "print(f'Accuracy with re-ranking: {re_ranked_accuracy}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bb46e242",
   "metadata": {
    "id": "bb46e242"
   },
   "outputs": [],
   "source": [
    "# Re-ranking got slightly better after 1 epoch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0cfcd92e-31ad-4bf7-9e30-b6d260a06871",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "0cfcd92e-31ad-4bf7-9e30-b6d260a06871",
    "outputId": "ea88ceee-5307-491e-afe8-a5a8a43dba97"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-04533850-9071-4c72-8201-4d2b69823f96\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>final_results</th>\n",
       "      <th>retrieved_correct_position</th>\n",
       "      <th>reranked_correct_position</th>\n",
       "      <th>results_from_pinecone</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': '2f90090e21f19450887d5f3ff781e541',\n",
       " '...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': '49201636ad4102735125e146c0dbafa4',\n",
       " '...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': '80d92494d2b06f341842f1855d2938cf',\n",
       " '...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': 'e3fd54f33b021ea3cf88b438fefcada7',\n",
       " '...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>{'final_results': [{'score': 0.8746502, 'id': ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[{'id': '37ed40c20d4e1b9cc8d6cc27a4d0fff3',\n",
       " '...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-04533850-9071-4c72-8201-4d2b69823f96')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-04533850-9071-4c72-8201-4d2b69823f96 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-04533850-9071-4c72-8201-4d2b69823f96');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "<div id=\"df-93c5c343-5687-4e9a-a551-b87fee369a61\">\n",
       "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-93c5c343-5687-4e9a-a551-b87fee369a61')\"\n",
       "            title=\"Suggest charts\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "     width=\"24px\">\n",
       "    <g>\n",
       "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
       "    </g>\n",
       "</svg>\n",
       "  </button>\n",
       "\n",
       "<style>\n",
       "  .colab-df-quickchart {\n",
       "      --bg-color: #E8F0FE;\n",
       "      --fill-color: #1967D2;\n",
       "      --hover-bg-color: #E2EBFA;\n",
       "      --hover-fill-color: #174EA6;\n",
       "      --disabled-fill-color: #AAA;\n",
       "      --disabled-bg-color: #DDD;\n",
       "  }\n",
       "\n",
       "  [theme=dark] .colab-df-quickchart {\n",
       "      --bg-color: #3B4455;\n",
       "      --fill-color: #D2E3FC;\n",
       "      --hover-bg-color: #434B5C;\n",
       "      --hover-fill-color: #FFFFFF;\n",
       "      --disabled-bg-color: #3B4455;\n",
       "      --disabled-fill-color: #666;\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart {\n",
       "    background-color: var(--bg-color);\n",
       "    border: none;\n",
       "    border-radius: 50%;\n",
       "    cursor: pointer;\n",
       "    display: none;\n",
       "    fill: var(--fill-color);\n",
       "    height: 32px;\n",
       "    padding: 0;\n",
       "    width: 32px;\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart:hover {\n",
       "    background-color: var(--hover-bg-color);\n",
       "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "    fill: var(--button-hover-fill-color);\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart-complete:disabled,\n",
       "  .colab-df-quickchart-complete:disabled:hover {\n",
       "    background-color: var(--disabled-bg-color);\n",
       "    fill: var(--disabled-fill-color);\n",
       "    box-shadow: none;\n",
       "  }\n",
       "\n",
       "  .colab-df-spinner {\n",
       "    border: 2px solid var(--fill-color);\n",
       "    border-color: transparent;\n",
       "    border-bottom-color: var(--fill-color);\n",
       "    animation:\n",
       "      spin 1s steps(1) infinite;\n",
       "  }\n",
       "\n",
       "  @keyframes spin {\n",
       "    0% {\n",
       "      border-color: transparent;\n",
       "      border-bottom-color: var(--fill-color);\n",
       "      border-left-color: var(--fill-color);\n",
       "    }\n",
       "    20% {\n",
       "      border-color: transparent;\n",
       "      border-left-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "    }\n",
       "    30% {\n",
       "      border-color: transparent;\n",
       "      border-left-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "      border-right-color: var(--fill-color);\n",
       "    }\n",
       "    40% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "    }\n",
       "    60% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "    }\n",
       "    80% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "      border-bottom-color: var(--fill-color);\n",
       "    }\n",
       "    90% {\n",
       "      border-color: transparent;\n",
       "      border-bottom-color: var(--fill-color);\n",
       "    }\n",
       "  }\n",
       "</style>\n",
       "\n",
       "  <script>\n",
       "    async function quickchart(key) {\n",
       "      const quickchartButtonEl =\n",
       "        document.querySelector('#' + key + ' button');\n",
       "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
       "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
       "      try {\n",
       "        const charts = await google.colab.kernel.invokeFunction(\n",
       "            'suggestCharts', [key], {});\n",
       "      } catch (error) {\n",
       "        console.error('Error during call to suggestCharts:', error);\n",
       "      }\n",
       "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
       "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
       "    }\n",
       "    (() => {\n",
       "      let quickchartButtonEl =\n",
       "        document.querySelector('#df-93c5c343-5687-4e9a-a551-b87fee369a61 button');\n",
       "      quickchartButtonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "    })();\n",
       "  </script>\n",
       "</div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "text/plain": [
       "                                       final_results  \\\n",
       "0  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "1  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "2  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "3  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "4  {'final_results': [{'score': 0.8746502, 'id': ...   \n",
       "\n",
       "   retrieved_correct_position  reranked_correct_position  \\\n",
       "0                         0.0                        0.0   \n",
       "1                         0.0                        0.0   \n",
       "2                         0.0                        0.0   \n",
       "3                         0.0                        0.0   \n",
       "4                         0.0                        0.0   \n",
       "\n",
       "                               results_from_pinecone  \n",
       "0  [{'id': '2f90090e21f19450887d5f3ff781e541',\n",
       " '...  \n",
       "1  [{'id': '49201636ad4102735125e146c0dbafa4',\n",
       " '...  \n",
       "2  [{'id': '80d92494d2b06f341842f1855d2938cf',\n",
       " '...  \n",
       "3  [{'id': 'e3fd54f33b021ea3cf88b438fefcada7',\n",
       " '...  \n",
       "4  [{'id': '37ed40c20d4e1b9cc8d6cc27a4d0fff3',\n",
       " '...  "
      ]
     },
     "execution_count": 276,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ft_predictions_df = pd.DataFrame(ft_predictions)\n",
    "ft_predictions_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9Sr2q5IN9LMz",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "9Sr2q5IN9LMz",
    "outputId": "4a670895-a2df-4300-9b8c-5d549c2e8517"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "retrieved_correct_position    26\n",
       "reranked_correct_position     26\n",
       "dtype: int64"
      ]
     },
     "execution_count": 277,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ft_predictions_df[['retrieved_correct_position', 'reranked_correct_position']].isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "75b414c6",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "75b414c6",
    "outputId": "30220b68-5830-407f-e3ed-678ee4378a58"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "retrieved_correct_position    1.310160\n",
       "reranked_correct_position     0.644385\n",
       "dtype: float64"
      ]
     },
     "execution_count": 278,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ft_predictions_df[['retrieved_correct_position', 'reranked_correct_position']].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2535cbae",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "2535cbae",
    "outputId": "97f405f3-c446-47a2-e645-9440945df769"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 866 975\n",
      "3 1009 1056\n",
      "5 1048 1077\n",
      "10 1072 1101\n",
      "25 1108 1117\n",
      "50 1122 1122\n"
     ]
    }
   ],
   "source": [
    "# do recall @ 1, 3, 5, 10\n",
    "for k in (1, 3, 5, 10, 25, 50):\n",
    "    embedding_only_recall = ft_predictions_df[ft_predictions_df['retrieved_correct_position'] < k].shape[0]\n",
    "    reranked_recall = ft_predictions_df[ft_predictions_df['reranked_correct_position'] < k].shape[0]\n",
    "    print(k, embedding_only_recall, reranked_recall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d9e5e922-7667-4a02-b4fc-7acb9cc97c24",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8faf0c1a",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 224
    },
    "id": "8faf0c1a",
    "outputId": "33c6657e-f529-4cc7-9ee5-1dff61e4172f"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1148/1148 [13:31<00:00,  1.42it/s]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-da5f3659-2adf-46d9-b477-ddc7ef9a51f3\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>retrieved_correct_position</th>\n",
       "      <th>reranked_correct_position</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-da5f3659-2adf-46d9-b477-ddc7ef9a51f3')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-da5f3659-2adf-46d9-b477-ddc7ef9a51f3 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-da5f3659-2adf-46d9-b477-ddc7ef9a51f3');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "<div id=\"df-e7255059-6dad-48f1-9b6b-21545152f562\">\n",
       "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-e7255059-6dad-48f1-9b6b-21545152f562')\"\n",
       "            title=\"Suggest charts\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "     width=\"24px\">\n",
       "    <g>\n",
       "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
       "    </g>\n",
       "</svg>\n",
       "  </button>\n",
       "\n",
       "<style>\n",
       "  .colab-df-quickchart {\n",
       "      --bg-color: #E8F0FE;\n",
       "      --fill-color: #1967D2;\n",
       "      --hover-bg-color: #E2EBFA;\n",
       "      --hover-fill-color: #174EA6;\n",
       "      --disabled-fill-color: #AAA;\n",
       "      --disabled-bg-color: #DDD;\n",
       "  }\n",
       "\n",
       "  [theme=dark] .colab-df-quickchart {\n",
       "      --bg-color: #3B4455;\n",
       "      --fill-color: #D2E3FC;\n",
       "      --hover-bg-color: #434B5C;\n",
       "      --hover-fill-color: #FFFFFF;\n",
       "      --disabled-bg-color: #3B4455;\n",
       "      --disabled-fill-color: #666;\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart {\n",
       "    background-color: var(--bg-color);\n",
       "    border: none;\n",
       "    border-radius: 50%;\n",
       "    cursor: pointer;\n",
       "    display: none;\n",
       "    fill: var(--fill-color);\n",
       "    height: 32px;\n",
       "    padding: 0;\n",
       "    width: 32px;\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart:hover {\n",
       "    background-color: var(--hover-bg-color);\n",
       "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "    fill: var(--button-hover-fill-color);\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart-complete:disabled,\n",
       "  .colab-df-quickchart-complete:disabled:hover {\n",
       "    background-color: var(--disabled-bg-color);\n",
       "    fill: var(--disabled-fill-color);\n",
       "    box-shadow: none;\n",
       "  }\n",
       "\n",
       "  .colab-df-spinner {\n",
       "    border: 2px solid var(--fill-color);\n",
       "    border-color: transparent;\n",
       "    border-bottom-color: var(--fill-color);\n",
       "    animation:\n",
       "      spin 1s steps(1) infinite;\n",
       "  }\n",
       "\n",
       "  @keyframes spin {\n",
       "    0% {\n",
       "      border-color: transparent;\n",
       "      border-bottom-color: var(--fill-color);\n",
       "      border-left-color: var(--fill-color);\n",
       "    }\n",
       "    20% {\n",
       "      border-color: transparent;\n",
       "      border-left-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "    }\n",
       "    30% {\n",
       "      border-color: transparent;\n",
       "      border-left-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "      border-right-color: var(--fill-color);\n",
       "    }\n",
       "    40% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "    }\n",
       "    60% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "    }\n",
       "    80% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "      border-bottom-color: var(--fill-color);\n",
       "    }\n",
       "    90% {\n",
       "      border-color: transparent;\n",
       "      border-bottom-color: var(--fill-color);\n",
       "    }\n",
       "  }\n",
       "</style>\n",
       "\n",
       "  <script>\n",
       "    async function quickchart(key) {\n",
       "      const quickchartButtonEl =\n",
       "        document.querySelector('#' + key + ' button');\n",
       "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
       "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
       "      try {\n",
       "        const charts = await google.colab.kernel.invokeFunction(\n",
       "            'suggestCharts', [key], {});\n",
       "      } catch (error) {\n",
       "        console.error('Error during call to suggestCharts:', error);\n",
       "      }\n",
       "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
       "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
       "    }\n",
       "    (() => {\n",
       "      let quickchartButtonEl =\n",
       "        document.querySelector('#df-e7255059-6dad-48f1-9b6b-21545152f562 button');\n",
       "      quickchartButtonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "    })();\n",
       "  </script>\n",
       "</div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "text/plain": [
       "   retrieved_correct_position  reranked_correct_position\n",
       "0                         0.0                        0.0\n",
       "1                         0.0                        0.0\n",
       "2                         0.0                        0.0\n",
       "3                         1.0                        0.0\n",
       "4                         0.0                        0.0"
      ]
     },
     "execution_count": 423,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "logger.setLevel(logging.CRITICAL)\n",
    "os_predictions = []\n",
    "\n",
    "for i, question in tqdm(enumerate(test_sample), total=len(test_sample)):\n",
    "    os_predictions.append(eval_ranking_open_source(question['question'], top_k=TOP_K, re_rank_model=finetuned))\n",
    "\n",
    "os_predictions_df = pd.DataFrame(os_predictions)\n",
    "os_predictions_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6eaeb9b4",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "6eaeb9b4",
    "outputId": "01787cbe-fd05-4cf6-83bc-66c8573d0dd6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy without re-ranking: 0.5017421602787456\n",
      "Accuracy with re-ranking: 0.6193379790940766\n"
     ]
    }
   ],
   "source": [
    "raw_accuracy = sum([p['retrieved_correct_position'] == 0 for p in os_predictions])/len(os_predictions)\n",
    "reranked_accuracy = sum([p['reranked_correct_position'] == 0 for p in os_predictions])/len(os_predictions)\n",
    "\n",
    "print(f'Accuracy without re-ranking: {raw_accuracy}')\n",
    "print(f'Accuracy with re-ranking: {reranked_accuracy}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "T00iM9SyaUFI",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "T00iM9SyaUFI",
    "outputId": "c9dda451-d289-4734-c94c-86dcd0fb155c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 576 711\n",
      "3 887 1006\n",
      "5 948 1055\n",
      "10 1008 1087\n",
      "25 1073 1103\n",
      "50 1107 1107\n"
     ]
    }
   ],
   "source": [
    "# do recall @ 1, 3, 5, 10\n",
    "OPEN_SOURCE_RETRIEVAL = []\n",
    "OPEN_SOURCE_RETRIEVAL_PLUS_FT_CE = []\n",
    "for k in (1, 3, 5, 10, 25, 50):\n",
    "    embedding_only_recall = os_predictions_df[os_predictions_df['retrieved_correct_position'] < k].shape[0]\n",
    "    reranked_recall = os_predictions_df[os_predictions_df['reranked_correct_position'] < k].shape[0]\n",
    "    print(k, embedding_only_recall, reranked_recall)\n",
    "    OPEN_SOURCE_RETRIEVAL.append(embedding_only_recall / os_predictions_df.shape[0])\n",
    "    OPEN_SOURCE_RETRIEVAL_PLUS_FT_CE.append(reranked_recall / os_predictions_df.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "sZD_4weEahOm",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 564
    },
    "id": "sZD_4weEahOm",
    "outputId": "df7327c7-50a5-454f-9daa-69cb7e9ca1b2"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3sAAAIjCAYAAAC6ZwLNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADwE0lEQVR4nOzdd3hUVfrA8e+dPukVQugE6U1RQlMsSFFAdBXUVZFVLGtH1wUboOuydlzLoutaVtefoK6uuwoIKDaKCoIivYSS0NL71PP7YzKTmcykJ0wS3s/z5MnMmXPvPXPn3jv3ndM0pZRCCCGEEEIIIUSbogt3AYQQQgghhBBCND0J9oQQQgghhBCiDZJgTwghhBBCCCHaIAn2hBBCCCGEEKINkmBPCCGEEEIIIdogCfaEEEIIIYQQog2SYE8IIYQQQggh2iAJ9oQQQgghhBCiDZJgTwghhBBCCCHaIAn2WhhN05g/f364i9Gszj33XAYMGHBStlXX/Tl//nw0TQtI69atG9dff33zFKyFO/fcczn33HMbtOypvN/CKdQxfLKsWbMGTdNYs2ZNWLbvb/ny5QwZMgSLxYKmaeTn53P99dfTrVu3cBetVWjMud+c3G43AwYM4PHHH6/3sqGOz5Z+TLT08kHLPVZainB+hhkZGWiaxtNPPx2W7bdl3u/a7OzsZtuG9/N78803fWlz5swhPT29QetrccHe3r17ufnmm+nRowcWi4WYmBhGjRrF888/T1lZWbiLJ4QQDVJaWsr8+fNbREDUVuXk5DBt2jSsVisvvfQSb7/9NpGRkWEt09q1a5k/fz75+flhLUdzcLlcvPHGG5x77rkkJCRgNpvp1q0bM2fO5Mcff/Tle/PNN9E0rdq/9evX17qt//u//+PQoUPcfvvtzfmWmpyc956gMNTnPmHChKC8NpuNP/7xj6SmpmK1WklPT2flypVhKHXTa45j4bPPPmvzFQTC4+6772bLli188skn9V7W0AzlabBPP/2UK664ArPZzHXXXceAAQOw2+18++23/OEPf+DXX3/l1VdfDXcxm1VZWRkGQ4v6WE5ZO3fuRKdrcb+HiFaqtLSUBQsWADTLr+EPPfQQc+bMafL1tiY//PADRUVFPPbYY4wdO9aX/ve//x232x2WMq1du5YFCxZw/fXXExcXF5YyNIeysjIuu+wyli9fzjnnnMMDDzxAQkICGRkZLF26lLfeeouDBw/SqVMn3zKPPvoo3bt3D1pXz549a93eU089xZVXXklsbGyTvo/m1tDzPpzHbHPo1KkTCxcuDEhLTU0Nynf99dfzwQcfcPfdd3Paaafx5ptvctFFF/Hll18yevTok1XcZtEc3wGfffYZL730kgR8p4CUlBQuueQSnn76aaZMmVKvZVtMVLF//36uvPJKunbtyhdffEGHDh18r912223s2bOHTz/9NIwlbD5utxu73Y7FYsFisYS7OKKC2WwOdxFEFddffz0ZGRkn/Vfy0tJSIiIiTuo2S0pK6lUrZTAYTvkfio4fPw4QFFQZjcYwlKZt+8Mf/sDy5ct57rnnuPvuuwNemzdvHs8991zQMhMnTuTMM8+s97Z++ukntmzZwjPPPNPQ4jYZpRTl5eVYrdZmWb/3vG9rx2xsbCzXXHNNjXm+//573nvvPZ566inuu+8+AN8P//fffz9r166t93bDce0WdVff77m68r+vbkumTZvGFVdcwb59++jRo0edl2sx1RZPPvkkxcXF/OMf/wgI9Lx69uzJXXfd5XvudDp57LHHSEtL8zUdeeCBB7DZbAHLdevWjUmTJrFmzRrOPPNMrFYrAwcO9N0s/vvf/2bgwIFYLBaGDh3KTz/9FLD89ddfT1RUFPv27WP8+PFERkaSmprKo48+ilIqIO/TTz/NyJEjSUxMxGq1MnToUD744IOg96JpGrfffjv/+te/6N+/P2azmeXLl/te8/+Fxts2eM+ePb5fhmNjY5k5cyalpaUB6y0rK+POO+8kKSmJ6OhopkyZQmZmZp37rdlsNubNm0fPnj0xm8107tyZ+++/P2ifesv//vvv069fP6xWKyNGjOCXX34B4JVXXqFnz55YLBbOPfdcMjIyQm5v48aNjBw5EqvVSvfu3Vm8eHGDy2Sz2bjnnntITk72vffDhw+H3O63337LWWedhcViIS0tjVdeeSVkvqp9z7xNkb777jtmz55NcnIykZGRXHrppZw4cSJgWbfbzfz580lNTSUiIoLzzjuPbdu21ak/m39b+5deeokePXoQERHBuHHjOHToEEopHnvsMTp16oTVauWSSy4hNzc3aD0vv/yy7/hKTU3ltttuC9mU7NVXXyUtLQ2r1cqwYcP45ptvQparrp9FVQ6HgwULFnDaaadhsVhITExk9OjRJ7VpjrfPzpIlS3jggQdISUkhMjKSKVOmcOjQoYC83j6lGzdu5JxzziEiIoIHHngAaPg+yMjIIDk5GYAFCxb4mjF5z0vvdWbv3r1cdNFFREdH89vf/haAb775hiuuuIIuXbr4tnnPPfcENWsP1WfPe65+/PHHDBgwALPZTP/+/X3XG3+ZmZn87ne/o3379r58r7/+elC+w4cPM3XqVCIjI2nXrh333HNPre8f4IMPPkDTNL766qug11555RU0TWPr1q0AHD16lJkzZ9KpUyfMZjMdOnTgkksuqfZaAp7PbcaMGQCcddZZaJrmO9eq9p3xP8e8x7/ZbOass87ihx9+CFr3jh07uPzyy0lISMBisXDmmWfWqSnN/Pnz+cMf/gBA9+7dfZ97RkZGyD4ZXo35HgB45513GDp0KFarlYSEBK688sqg4xzqfu5XdfjwYV555RUuvPDCoEAPQK/Xc9999wXU6jXGxx9/jMlk4pxzzglIP3DgAL///e/p3bs3VquVxMRErrjiihqPk/ry3kOsWLHCdw/h/c7Iz8/n7rvvpnPnzpjNZnr27MkTTzzhq5FrzHkfqr+X2+1m0aJF9O/fH4vFQvv27bn55pvJy8vz5Zk0aVK1N4EjRowICrab+1jx53Q6KS4urvb1Dz74AL1ez0033eRLs1gs3HDDDaxbty5kufw1xbV75cqVjB49mri4OKKioujdu7dvHVB5H1D1GKut33Jtx0JDrnnXX389L730EkBA89iqmuoaV597oOrKW93xXpdjuyY13VfX9968Lt+XVR04cICePXsyYMAAjh07BtR+ffDy9iuPjY0lLi6OGTNmVNvs39ti5T//+U+d9otXi/kZ+L///S89evRg5MiRdcp/44038tZbb3H55Zdz7733smHDBhYuXMj27dv56KOPAvLu2bOHq6++mptvvplrrrmGp59+msmTJ7N48WIeeOABfv/73wOwcOFCpk2bFtR8z+VyMWHCBIYPH86TTz7J8uXLmTdvHk6nk0cffdSX7/nnn2fKlCn89re/xW63895773HFFVfwv//9j4svvjigTF988QVLly7l9ttvJykpqdZOvNOmTaN79+4sXLiQTZs28dprr9GuXTueeOIJX57rr7+epUuXcu211zJ8+HC++uqroO1Wx+12M2XKFL799ltuuukm+vbtyy+//MJzzz3Hrl27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166+595zLDExUeXm5vrS//Of/yhA/fe///WlXXDBBWrgwIG+80spz3fAyJEj1WmnnVZrmZ566qmga6B/Gd54442gZRr6PZCRkaH0er16/PHHA/L98ssvymAw+NLrc+6Hcs899yhA/fTTTzXm8/J+LqH+zGZzrct36tRJ/eY3vwlKD3VurFu3TgHqn//8py/Ne/5X/W73Pyaq472HWL58eUD6Y489piIjI9WuXbsC0ufMmaP0er06ePCgUqrh533V8n3zzTcKUP/6178C8i1fvjwgvaCgQJnNZnXvvfcG5HvyyScDrhkn61hRSqnf/e53av78+erDDz9U//znP9WUKVMUoKZNmxaQr3///kH3S0op9euvv4a8JlfV2Gv3c889p4CA+7qqvMdy1fO5LsdYdcdCY655t912W9B1X6nmucbV9R6oOtUd73U9tmtS0311fe7N6/J96b0enzhxQm3fvl2lpqaqs846K2A/1/X68PHHHytAPfnkk748TqdTnX322dV+P4wbN0717du31n3ir0U04ywsLAQgOjq6Tvk/++wzAGbPnh2Qfu+99wIE9e3r168fI0aM8D33Dl16/vnn06VLl6D0ffv2BW3TfwQw76/fdrudVatW+dL9awby8vIoKCjg7LPPZtOmTUHrGzNmDP369avlnVa65ZZbAp6fffbZ5OTk+Padt5rZW0vpdccdd9Rp/e+//z59+/alT58+ZGdn+/7OP/98AL788suA/BdccEHAr03effeb3/wm4HOsbp8aDAZuvvlm33OTycTNN9/M8ePH2bhxY73K5D0e7rzzzoBtVG1e5HK5WLFiBVOnTg343Pv27cv48ePrsJc8brrppoCmEmeffTYul4sDBw4AsHr1apxOZ4M/C68rrrgiYDAC77685pprAvpmpaenY7fbyczMBGDVqlXY7XbuvvvugBrqWbNmERMT4zs/fvzxR44fP84tt9yCyWTy5fM2J/BX3+PDX1xcHL/++iu7d++u1/t3u90B28rOzsZms+FwOILSHQ5HndZ53XXXBRyfl19+OR06dPAdQ15ms5mZM2cGpDVmH9TVrbfeGpTmf10pKSkhOzubkSNHopQKanYeytixYwNquAYNGkRMTIzvnFRK8eGHHzJ58mSUUgHvbfz48RQUFPiuYZ999hkdOnTg8ssv960vIiIioNlVTaZPn87x48cD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x0y7du0499xzeeWVV3y1C/68+8b7w4T/n/dGxPuDVtXPPSYmhqSkpKC+XVWv4fVx2WWXodfrWbBgQdAv0Uop37lYn3M/lM6dOzNr1iw+//zzkN8xbrebZ555ptrpb+prxIgRbN26Nejz1+v1Qe/zhRdeaHQtS11MmzaNdevWhfzuyM/Px+l0Ag0776vbnsvl4rHHHgt6zel0Bq1/+vTpZGVl8dprr7Fly5agH1RO1rFSWFgY9LkppfjTn/4EEFCbdPnll+NyuQKuJzabjTfeeIP09PQGt+ap67U71BRG3gDT+x683UX8z9uqZa5OdcdCY6551V1f6qqu17jmVNdju1+/fgHXWO+9Yk2a895c0zReffVVLr/8cmbMmBEwVUVdrw8XXXQRTqcz4H7R5XJVe+9eUFDA3r176zxzgVeLqdlLS0vj3XffZfr06fTt29c3kabdbmft2rW8//77vjmTBg8ezIwZM3j11VfJz89nzJgxfP/997z11ltMnTqV8847r0nLZrFYWL58OTNmzCA9PZ1ly5bx6aef8sADD/h+lbr44ot59tlnmTBhAldffTXHjx/npZdeomfPnvz8889NWp5Qhg4dym9+8xsWLVpETk6Ob+oFb21Zbb/+XHvttSxdupRbbrmFL7/8klGjRuFyudixYwdLly71zTHUVFJTU3niiSfIyMigV69eLFmyhM2bN/Pqq6/6+grUtUxDhgzhqquu4uWXX6agoICRI0eyevXqkLWaCxYsYPny5Zx99tn8/ve/x+l08sILL9C/f/8m+5zat2/PXXfdxTPPPMOUKVOYMGECW7ZsYdmyZSQlJTV7zWlycjJz585lwYIFTJgwgSlTprBz505efvllzjrrLN8vY0ajkT/96U/cfPPNnH/++UyfPp39+/fzxhtvBPXFaMzx0a9fP84991yGDh1KQkICP/74Ix988EHAoEcnS0JCAqNHj2bmzJkcO3aMRYsW0bNnT2bNmlXrso09R6xWK/369WPJkiX06tWLhIQEBgwY4JtuIJQ+ffqQlpbGfffdR2ZmJjExMXz44YdNXkP8l7/8hS+//JL09HRmzZpFv379yM3NZdOmTaxatcp3EzRr1ixefPFFrrvuOjZu3EiHDh14++236zXEvdFo5LLLLuO9996jpKSEp59+OuD1Xbt2ccEFFzBt2jT69euHwWDgo48+4tixY1x55ZVN+r7r4qWXXmL06NEMHDiQWbNm0aNHD44dO8a6des4fPgwW7ZsqXF57w3Jgw8+yJVXXonRaGTy5Mm+Hzf/8pe/cOONN3LmmWfy9ddf+67ZDZGWlsaf/vQn5s6dS0ZGBlOnTiU6Opr9+/fz0UcfcdNNN3HffffV69yvzjPPPMPevXu58847+fe//82kSZOIj4/n4MGDvP/+++zYsSPo81q2bBk7duwIWtfIkSNr3O4ll1zCY489xldffcW4ceN86ZMmTeLtt98mNjaWfv36sW7dOlatWlXrVA5N4Q9/+AOffPIJkyZN4vrrr2fo0KGUlJTwyy+/8MEHH5CRkUFSUlKDzvtQxowZw80338zChQvZvHkz48aNw2g0snv3bt5//32ef/75gIGTvPOY3Xfffb4fdPydrGNl06ZNXHXVVVx11VX07NmTsrIyPvroI7777jtuuukmzjjjDF/e9PR0rrjiCubOncvx48fp2bMnb731FhkZGfzjH/+o1/7yV9dr96OPPsrXX3/NxRdfTNeuXTl+/Dgvv/wynTp1YvTo0QD079+f4cOHM3fuXHJzc0lISOC9997z3bzXpLpjwel0Nvia572+3HnnnYwfPx69Xl/v62Rjr3GNVd9juz6a+95cp9PxzjvvMHXqVKZNm8Znn33G+eefX+frw+TJkxk1ahRz5swhIyODfv368e9//7vaPserVq3yTddQL/Uau/Mk2LVrl5o1a5bq1q2bMplMKjo6Wo0aNUq98MILAcPCOhwOtWDBAtW9e3dlNBpV586d1dy5cwPyKOUZNjnUsO+Auu222wLSvEPV+g9/O2PGDBUZGan27t2rxo0bpyIiIlT79u3VvHnzAoa1V0qpf/zjH+q0005TZrNZ9enTR73xxhvVDodeddv+r4UacrvqUMChhv8tKSlRt912m0pISFBRUVFq6tSpaufOnQpQf/nLX0Juz5/dbldPPPGE6t+/vzKbzSo+Pl4NHTpULViwQBUUFNR73ylVORzx+++/70sbM2aM6t+/v/rxxx/ViBEjlMViUV27dlUvvvhig8tUVlam7rzzTpWYmKgiIyPV5MmT1aFDh0IOc/zVV1+poUOHKpPJpHr06KEWL14c8nOqbuqFqsO6hxpy2el0qocfflilpKQoq9Wqzj//fLV9+3aVmJiobrnlltAfQAP2ZU3levHFF1WfPn2U0WhU7du3V7feeqvKy8sL2t7LL7+sunfvrsxmszrzzDPV119/rcaMGRM0pHZdP4uq++1Pf/qTGjZsmIqLi1NWq1X16dNHPf74474pNuqjsVMv/N///Z+aO3euateunbJareriiy8OmL5AqcrjM5S67oPqrF271nfs+R+b3utMKNu2bVNjx45VUVFRKikpSc2aNcs3HLT/sMz1udZU/YyUUurYsWPqtttuU507d1ZGo1GlpKSoCy64QL366qsB+Q4cOKCmTJmiIiIiVFJSkrrrrrt8Q2TXNvWC18qVKxWgNE1Thw4dCngtOztb3XbbbapPnz4qMjJSxcbGqvT09IDpHqpT36kXQg11HuqasXfvXnXdddeplJQUZTQaVceOHdWkSZPUBx98UKf3+9hjj6mOHTsqnU4XcN0uLS1VN9xwg4qNjVXR0dFq2rRp6vjx4436HlBKqQ8//FCNHj1aRUZGqsjISNWnTx912223qZ07dwbkq+u5Xx2n06lee+01dfbZZ6vY2FhlNBpV165d1cyZMwOmZahp6oWqx3F1Bg0apG644YaAtLy8PDVz5kyVlJSkoqKi1Pjx49WOHTuCju/GTr1Q3dQxRUVFau7cuapnz57KZDKppKQkNXLkSPX0008HXN8act5XV75XX31VDR06VFmtVhUdHa0GDhyo7r//fpWVlRWU97e//a1vqPzqNPexsm/fPnXFFVeobt26KYvFoiIiItTQoUPV4sWLA4bv9yorK1P33XefSklJUWazWZ111llB015Up7HX7tWrV6tLLrlEpaamKpPJpFJTU9VVV10VNHz+3r171dixY5XZbFbt27dXDzzwgO+aVtsxFupYaMw1z+l0qjvuuEMlJycrTdN83wHNcY2rzz1QKDUd70rV79gO9Z6qu69u7L151etJqOtxaWmpGjNmjIqKilLr169XStX9+pCTk6OuvfZaFRMTo2JjY9W1116rfvrpp5DXxunTp6vRo0fXuj+q0ireoKjG9ddfzwcffEBxcXG4i9Igmzdv5vTTT+edd97ht7/9bbiLc0rLz88nPj6eP/3pTzz44IPhLs4pZc2aNZx33nm8//77Df6FUAgRPm+//Ta33XYbBw8e9A2RL4QQp4qjR4/SvXt33nvvvXrX7LWYPnui8ULNQbNo0SJ0Oh3nnHNOGEp06qruswDqNEWAEEKISr/9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UuYp2XNSp1JypmTavcde7hRON2/wCS7CyEREREREpDRQsuekcitxFmi9nj3JoYiIiIiIODUle07K4W0XVIlTRERERKRcUbLnpK6fxmkXFWcRERERESlXlOw5KcencWpkT0RERESkPFGy56Qc3lA9MS7na4AqcYqIiIiIlAdK9pxQamYqiRmJgCNr9rShuoiIiIhIeaJkzwnljuoFeAbg5+F36xvMZkjOuUfTOEVEREREygcle07Iul7P1871eilnIfsaGK7gb+c9IiIiIiLi1JTsOaHckb1q/nZOycwtzlIhDFzdiigqEREREREpTZTsOaHcZM/ukb3cZE/r9UREREREyg0le07IuqG6v/bYExERERGR/CnZc0IOb7ugPfZERERERModJXtOyOFpnBrZExEREREpd5TsOZnka8lcuXYFgDA/e9fs/b7Hnkb2RERERETKDSV7TiZ3vV6QVxA+7j723ZSkkT0RERERkfJGyZ6TOX3FwfV6VxMhIznnuapxioiIiIiUG0r2nIx1vZ7dUzh/H9XzCQYP3yKKSkREREREShsle07G4UqcKs4iIiIiIlIuKdlzMtY99uzeduH34iyawikiIiIiUq4o2XMyp1Md3WMvLudrYI0iikhEREREREojJXtOxGKxWAu02L1mT9M4RURERETKJSV7TiQpI4m0rDSgAAVatMeeiIiIiEi5omTPieQWZwnxDsHT1dO+m7RmT0RERESkXFKy50Qc3nYhMx1SzuY8D9CaPRERERGR8kTJnhNxeNuF5JzrcfcBn6AiikpEREREREojJXtOxPE99n6vxBlQHQyjiKISEREREZHSSMmeE3E42ctdr6fiLCIiIiIi5Y6SPSeSu6G6w5U4VZxFRERERKTcUbLnJCwWizXZq+ZnZ/KmPfZERERERMotJXtO4lL6JdKz0zEwMPma7LvJuseeKnGKiIiIiJQ3SvacxJnUnFG9yj6VcXd1t++m6wu0iIiIiIhIuaJkz0nkTuG0uziLORuSc+7Rmj0RERERkfJHyZ6TyB3ZszvZSzkL5kwwXME/tAgjExERERGR0kjJnpM4nfr7tgv+9u6x9/t6vQpVwdWtiKISEREREZHSSsmek7Buu+Dr4LYL2mNPRERERKRcUrLnJHKncVbzt3P9XZK2XRARERERKc+U7DkBs8VMfGo84MCG6onaUF1ERERE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HetQn25ubowaNYp//vOfPP3000ydOpWQkBBmzpzJsWPHCAwMpEWLFrz00ktAToGUKVOm8MILLzB06FAGDRp0w8qUf+bj48PmzZuZMGECffr04cqVK1StWpX77rvPZqSvbt26tG7dmu3btzN79mybNl555RWOHTtGZGQkPj4+PPHEE/Tq1YukpCS7X7OXlxfffvstM2bM4KWXXuK3337D39+fjh07snXrVu68806727qRzp07U6VKFe68807Cwm6zOFA5ZlgcWV1ZTiQnJxMQEEBSUtJNh8iLQ2ZmJmvWrKF79+62852vpf5RFWvCb+AdWPR9FqGS6NOZ6P0RKRr63RLJX3p6OsePHyc8PBwvL23vJMUvOTmZatWqsXDhQh5++OEi7+9m/+ZLU27gKI3sOavcKZyeFQo10RMRERERKSlms5kLFy7w5ptvEhAQwF//+teSDsmpKdlzVprCKSIiIiJlTFxcHOHh4VSrVo05c+bg5qZ05Xbo3XNWidp2QURERETKllq1amGxWDCbzSQnJ5d0OE5P1TidVZI2VBcRERERkRtTsuesEjWNU0REREREbkzJnrNK0jROERERERG5MSV7ziq3GmdAjZKNQ0RERERESiUle84oOwuSz+Q818ieiIiIiIjkQ8meM7pyBizZ4OoBvpVLOhoRERERESmFtPWCM8otzlKhKrgoXxcREZHSJSE1gUvpl254PsgrCJOvqRgjKv3uvfdemjVrxuzZs0s6lCJz4sQJwsPD2bVrF82aNSvpcMoFJXvOKHe9nqZwioiISClzLfsa/b7ux8X0ize8JtgrmPUPr8fD1aPQ+z958iSTJ09m7dq1XLhwgdDQUHr16sWkSZMIDg62Xnf8+HFefvlloqOjuXTpEpUqVaJly5a88cYbNGjQoNDjAhgyZAiLFy/Oc/zIkSOsWrUKd3f3Qu8vMTGRL774olDbLWpHjx5l2rRpbNiwgQsXLhAWFsbdd9/Nc889R6tWrQAwDCPfe5ctW0a/fv2KM9xSTcNCzigpLuerirOIiIhIKePu4o7J14RB/h/GDQxMvibcXQo3sQE4duwYrVq14siRIyxbtoyjR48yb948Nm3aRNu2bbl0KWe0MTMzky5dupCUlMSqVas4dOgQK1asoHHjxiQmJtrd37333suiRYscirFr167Ex8fbPMLDwwkKCsLf39+htsqi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2pTPPvvMpo39+/fz4IMPUqFCBfz9/Wnfvj2xsbEA/O9//6NLly5UqlSJgIAAOnTowC+//HJbMf/22290796diRMn8sMPPzB48GBat25N8+bNGTx4MD///DM9evSgW7duZGZm3lZfIiIiuZTsiYiI09q3bx8///wzHh4e1mMzZ87k448/Zt68eezfv5+xY8cycOBAvv/+ewBOnz7NX/7yFzw9Pfn222/ZuXMnw4YNs06jvHLlCoMHD+bHH39k69at1KtXj+7du3PlypUCx/nCCy8wdOhQRowYwalTp3jwwQepXLkykZGRTJ06laeffprXXnsNX19fPv3009t7U0RERH6naZwiIuJUvv76a/z8/MjKyiIjIwMXFxfmzJkDQEZGBjNmzGDjxo20bdsWgNq1a/Pjjz/ywQcf0KFDB95//30CAgJYvnw57u7uANxxxx3W9jt16mTT34cffkhgYCDff/89Dz74oMPxpqSksHr1ao4fPw7A4MGD8fPzY+3atcTExPDUU0/x0EMPWc+tW7eOoUOHOv7GiIiI/ImSPRERcSodO3bkX//6F6mpqbz99tu4ublZk6WjR4+SlpZGly5dbO65du0azZs3B2D37t20b9/emuj92dmzZ3nllVeIjo7m3LlzZGdnk5aWRlxcXIHiPXz4MLVq1SI4OJjU1FS+/fZbTp8+TVhYGC1atCA6Oto6dTM0NJTLly8XqB8REZE/U7InIiJOxdfXl7p16wKwcOFCmjZtyoIFCxg+fDgpKSkArF69mqpVq9rc5+npCYC3t/dN2x88eDAXL17knXfeoWbNmnh6etK2bVuuXbtWoHizsrKsfeYmdb6+vtbzfn5+1gTvl19+sb42ERGR26U1eyIi4rRcXFx46aWXeOWVV7h69SoNGzbE09OTuLg46tata/OoXr06AE2aNOGHH364YSGUn376iWeffZbu3bvTqFEjPD09uXDhQoFjrF27NocPHyYzM5PAwEAaNWrE9OnTyczM5ODBgyxfvhyz2czq1at5//33GTVqVIH7EhERuZ6SPRERcWqPPPIIrq6uvP/++/j7+zN+/HjGjh3L4sWLiY2N5ZdffuG9995j8eLFAIwaNYrk5GT69evHjh07OHLkCJ988gmHDh0CoF69enzyySfExMSwbds2BgwYcMvRwJupVKkSTZo0sRZeiYqKYtmyZXh7e9O5c2f++te/8umnnzJp0iT+/e9/ExERcftvioiICEr2RETEybm5uTFq1Cj++c9/kpqaytSpU5k4cSIzZ84kIiKCrl27snr1asLDwwEIDg7m22+/JSUlhQ4dOtCyZUs++ugj6xq+BQsWcPnyZVq0aMHf/vY3nn322dve+27mzJmMHz+eX375hbvuuou4uDji4uI4ceIEs2bN4tKlS+zcuZP27dvf9vshIiKSy7BYLJaSDkJERKSsW7x4MaNHj+bZZ59l0KBB1KlTh+zsbLZv387MmTPp1KkTY8eOLekwRUSkDFGyJyIiUkz27t3La6+9xjfffMO1a9cwm83UrFmTJ598krFjx9rsFygiInK7lOyJiIgUs6ysLM6ePYunpyeVKlUq6XBERKSMUrInIiIiIiJSBqlAi4iIiIiISBmkZE9ERERERKQMUrInIiIiIiJSBinZExERERERKYOU7ImIiIiIiJRBSvZERERERETKICV7IiIiIiIiZZCSPRERERERkTLo/wPywHy5Xeb+sQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "X = [1, 3, 5, 10, 25, 50]\n",
    "\n",
    "OPENAI_RETRIEVAL = [866 / predictions_df.shape[0], 1009/ predictions_df.shape[0], 1048/ predictions_df.shape[0], 1072/ predictions_df.shape[0], 1108/ predictions_df.shape[0], 1122/ predictions_df.shape[0]]\n",
    "# OPEN_SOURCE_RETRIEVAL = [663 / predictions_df.shape[0], 795/ predictions_df.shape[0], 838/ predictions_df.shape[0], 891/ predictions_df.shape[0], 966/ predictions_df.shape[0], 1004/ predictions_df.shape[0]]\n",
    "OLD_CROSS_ENCODER = [956 / predictions_df.shape[0], 1057/ predictions_df.shape[0], 1077/ predictions_df.shape[0], 1094/ predictions_df.shape[0], 1120/ predictions_df.shape[0], 1122/ predictions_df.shape[0]]\n",
    "NEW_CROSS_ENCODER = [975 / predictions_df.shape[0], 1056/ predictions_df.shape[0], 1077/ predictions_df.shape[0], 1101/ predictions_df.shape[0], 1117/ predictions_df.shape[0], 1122/ predictions_df.shape[0]]\n",
    "\n",
    "# Creating the plot\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.plot(X, OPENAI_RETRIEVAL, label='OAI Retrieval Only', marker='o')\n",
    "plt.plot(X, OPEN_SOURCE_RETRIEVAL, label='OS Retrieval Only', marker='*')\n",
    "plt.plot(X, OPEN_SOURCE_RETRIEVAL_PLUS_FT_CE, label='OS + Finetuned CE', marker='v')\n",
    "plt.plot(X, OLD_CROSS_ENCODER, label='OAI + Pretrained CE', marker='s')\n",
    "plt.plot(X, NEW_CROSS_ENCODER, label='OAI + Finetuned CE', marker='^')\n",
    "\n",
    "# Adding titles and labels\n",
    "plt.title('Comparing embedding models + pre-trained vs fine-tuned CE (all retrieved 50 results then re-ranked)')\n",
    "plt.xlabel('Recall @')\n",
    "plt.ylabel('Performance')\n",
    "plt.xticks(X)\n",
    "plt.yticks([i/100 for i in range(70, 101, 5)])  # Adjusting y-ticks to start from 0.75\n",
    "\n",
    "# Adding legend\n",
    "plt.legend()\n",
    "\n",
    "# Show the plot\n",
    "plt.grid(True)\n",
    "# plt.show()\n",
    "\n",
    "plt.savefig('recall_at_k.png', dpi=1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "LFaZAKPhaymM",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 275
    },
    "id": "LFaZAKPhaymM",
    "outputId": "a58e68c7-f61e-420a-aef9-c8336bb48702"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-4363c439-77de-4ee1-b439-f4d0dbd94b7a\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>RECALL @</th>\n",
       "      <th>OS_Retrieval_Only</th>\n",
       "      <th>OS_Retrieval_Plus_Finetuned_CE</th>\n",
       "      <th>OAI_Retrieval_Only</th>\n",
       "      <th>OAI_Retrieval_Plus_Pretrained_CE</th>\n",
       "      <th>OAI_Retrieval_Plus_Finetuned_CE</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.501742</td>\n",
       "      <td>0.619338</td>\n",
       "      <td>0.754355</td>\n",
       "      <td>0.832753</td>\n",
       "      <td>0.849303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>0.772648</td>\n",
       "      <td>0.876307</td>\n",
       "      <td>0.878920</td>\n",
       "      <td>0.920732</td>\n",
       "      <td>0.919861</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5</td>\n",
       "      <td>0.825784</td>\n",
       "      <td>0.918990</td>\n",
       "      <td>0.912892</td>\n",
       "      <td>0.938153</td>\n",
       "      <td>0.938153</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10</td>\n",
       "      <td>0.878049</td>\n",
       "      <td>0.946864</td>\n",
       "      <td>0.933798</td>\n",
       "      <td>0.952962</td>\n",
       "      <td>0.959059</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>25</td>\n",
       "      <td>0.934669</td>\n",
       "      <td>0.960801</td>\n",
       "      <td>0.965157</td>\n",
       "      <td>0.975610</td>\n",
       "      <td>0.972997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>50</td>\n",
       "      <td>0.964286</td>\n",
       "      <td>0.964286</td>\n",
       "      <td>0.977352</td>\n",
       "      <td>0.977352</td>\n",
       "      <td>0.977352</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-4363c439-77de-4ee1-b439-f4d0dbd94b7a')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-4363c439-77de-4ee1-b439-f4d0dbd94b7a button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-4363c439-77de-4ee1-b439-f4d0dbd94b7a');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "<div id=\"df-37d7a99c-666e-4136-93f6-2ddeb94c2b86\">\n",
       "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-37d7a99c-666e-4136-93f6-2ddeb94c2b86')\"\n",
       "            title=\"Suggest charts\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "     width=\"24px\">\n",
       "    <g>\n",
       "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
       "    </g>\n",
       "</svg>\n",
       "  </button>\n",
       "\n",
       "<style>\n",
       "  .colab-df-quickchart {\n",
       "      --bg-color: #E8F0FE;\n",
       "      --fill-color: #1967D2;\n",
       "      --hover-bg-color: #E2EBFA;\n",
       "      --hover-fill-color: #174EA6;\n",
       "      --disabled-fill-color: #AAA;\n",
       "      --disabled-bg-color: #DDD;\n",
       "  }\n",
       "\n",
       "  [theme=dark] .colab-df-quickchart {\n",
       "      --bg-color: #3B4455;\n",
       "      --fill-color: #D2E3FC;\n",
       "      --hover-bg-color: #434B5C;\n",
       "      --hover-fill-color: #FFFFFF;\n",
       "      --disabled-bg-color: #3B4455;\n",
       "      --disabled-fill-color: #666;\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart {\n",
       "    background-color: var(--bg-color);\n",
       "    border: none;\n",
       "    border-radius: 50%;\n",
       "    cursor: pointer;\n",
       "    display: none;\n",
       "    fill: var(--fill-color);\n",
       "    height: 32px;\n",
       "    padding: 0;\n",
       "    width: 32px;\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart:hover {\n",
       "    background-color: var(--hover-bg-color);\n",
       "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "    fill: var(--button-hover-fill-color);\n",
       "  }\n",
       "\n",
       "  .colab-df-quickchart-complete:disabled,\n",
       "  .colab-df-quickchart-complete:disabled:hover {\n",
       "    background-color: var(--disabled-bg-color);\n",
       "    fill: var(--disabled-fill-color);\n",
       "    box-shadow: none;\n",
       "  }\n",
       "\n",
       "  .colab-df-spinner {\n",
       "    border: 2px solid var(--fill-color);\n",
       "    border-color: transparent;\n",
       "    border-bottom-color: var(--fill-color);\n",
       "    animation:\n",
       "      spin 1s steps(1) infinite;\n",
       "  }\n",
       "\n",
       "  @keyframes spin {\n",
       "    0% {\n",
       "      border-color: transparent;\n",
       "      border-bottom-color: var(--fill-color);\n",
       "      border-left-color: var(--fill-color);\n",
       "    }\n",
       "    20% {\n",
       "      border-color: transparent;\n",
       "      border-left-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "    }\n",
       "    30% {\n",
       "      border-color: transparent;\n",
       "      border-left-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "      border-right-color: var(--fill-color);\n",
       "    }\n",
       "    40% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "      border-top-color: var(--fill-color);\n",
       "    }\n",
       "    60% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "    }\n",
       "    80% {\n",
       "      border-color: transparent;\n",
       "      border-right-color: var(--fill-color);\n",
       "      border-bottom-color: var(--fill-color);\n",
       "    }\n",
       "    90% {\n",
       "      border-color: transparent;\n",
       "      border-bottom-color: var(--fill-color);\n",
       "    }\n",
       "  }\n",
       "</style>\n",
       "\n",
       "  <script>\n",
       "    async function quickchart(key) {\n",
       "      const quickchartButtonEl =\n",
       "        document.querySelector('#' + key + ' button');\n",
       "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
       "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
       "      try {\n",
       "        const charts = await google.colab.kernel.invokeFunction(\n",
       "            'suggestCharts', [key], {});\n",
       "      } catch (error) {\n",
       "        console.error('Error during call to suggestCharts:', error);\n",
       "      }\n",
       "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
       "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
       "    }\n",
       "    (() => {\n",
       "      let quickchartButtonEl =\n",
       "        document.querySelector('#df-37d7a99c-666e-4136-93f6-2ddeb94c2b86 button');\n",
       "      quickchartButtonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "    })();\n",
       "  </script>\n",
       "</div>\n",
       "\n",
       "  <div id=\"id_20b5e92e-5da3-4334-a0e4-03dad314ab26\">\n",
       "    <style>\n",
       "      .colab-df-generate {\n",
       "        background-color: #E8F0FE;\n",
       "        border: none;\n",
       "        border-radius: 50%;\n",
       "        cursor: pointer;\n",
       "        display: none;\n",
       "        fill: #1967D2;\n",
       "        height: 32px;\n",
       "        padding: 0 0 0 0;\n",
       "        width: 32px;\n",
       "      }\n",
       "\n",
       "      .colab-df-generate:hover {\n",
       "        background-color: #E2EBFA;\n",
       "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "        fill: #174EA6;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate {\n",
       "        background-color: #3B4455;\n",
       "        fill: #D2E3FC;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate:hover {\n",
       "        background-color: #434B5C;\n",
       "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "        fill: #FFFFFF;\n",
       "      }\n",
       "    </style>\n",
       "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('results_df')\"\n",
       "            title=\"Generate code using this dataframe.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "    <script>\n",
       "      (() => {\n",
       "      const buttonEl =\n",
       "        document.querySelector('#id_20b5e92e-5da3-4334-a0e4-03dad314ab26 button.colab-df-generate');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      buttonEl.onclick = () => {\n",
       "        google.colab.notebook.generateWithVariable('results_df');\n",
       "      }\n",
       "      })();\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "text/plain": [
       "   RECALL @  OS_Retrieval_Only  OS_Retrieval_Plus_Finetuned_CE  \\\n",
       "0         1           0.501742                        0.619338   \n",
       "1         3           0.772648                        0.876307   \n",
       "2         5           0.825784                        0.918990   \n",
       "3        10           0.878049                        0.946864   \n",
       "4        25           0.934669                        0.960801   \n",
       "5        50           0.964286                        0.964286   \n",
       "\n",
       "   OAI_Retrieval_Only  OAI_Retrieval_Plus_Pretrained_CE  \\\n",
       "0            0.754355                          0.832753   \n",
       "1            0.878920                          0.920732   \n",
       "2            0.912892                          0.938153   \n",
       "3            0.933798                          0.952962   \n",
       "4            0.965157                          0.975610   \n",
       "5            0.977352                          0.977352   \n",
       "\n",
       "   OAI_Retrieval_Plus_Finetuned_CE  \n",
       "0                         0.849303  \n",
       "1                         0.919861  \n",
       "2                         0.938153  \n",
       "3                         0.959059  \n",
       "4                         0.972997  \n",
       "5                         0.977352  "
      ]
     },
     "execution_count": 448,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# show results as a table\n",
    "\n",
    "results_df = pd.DataFrame({'RECALL @': [1, 3, 5, 10, 25, 50], 'OS_Retrieval_Only': OPEN_SOURCE_RETRIEVAL, 'OS_Retrieval_Plus_Finetuned_CE': OPEN_SOURCE_RETRIEVAL_PLUS_FT_CE   , 'OAI_Retrieval_Only': OPENAI_RETRIEVAL    , 'OAI_Retrieval_Plus_Pretrained_CE': OLD_CROSS_ENCODER, 'OAI_Retrieval_Plus_Finetuned_CE': NEW_CROSS_ENCODER})\n",
    "results_df"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "gpuType": "T4",
   "machine_shape": "hm",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "0295736b3f254a8590d911792f2c19db": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_3f1ba16f17c94fb8a409d152b9a6045a",
      "max": 1739,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_c485139a148e4207957e96b4275eeed2",
      "value": 1739
     }
    },
    "084ebc36eb9d4616acc1a0843673ac4f": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "098016d32abc4f45be0a4f747cbc3f11": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "0caf250cdae643479160eedc708ffeea": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_fa6089718c574ee19bd3c378e356ea6b",
       "IPY_MODEL_f78b642ffb784f9097e0cbf97c44b9bd",
       "IPY_MODEL_7c322a232739486a937883ac787f8750"
      ],
      "layout": "IPY_MODEL_1bc5237b0db94f4aa124c8c79a891955"
     }
    },
    "11e5c44fa73c4d5d88561036f2a0a070": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "168948926c2340abb8b52f8dd67a5e73": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "1bc5237b0db94f4aa124c8c79a891955": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "21316ef8a22d40ab9109ccf0fa7fa645": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_458bcab796d642c9afd2e534085b991f",
       "IPY_MODEL_266b42f10bd74b9f907588c1251c8d6c",
       "IPY_MODEL_ba968ae891a2400fa0db9f331b85b66c"
      ],
      "layout": "IPY_MODEL_5d09ef7e47f446a3a3a51458195a0fe3"
     }
    },
    "252dfe4d46604a089c263bb0eae17a3a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "266b42f10bd74b9f907588c1251c8d6c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_b070922627a04195a41899a169984b08",
      "max": 1,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_85a67e7f5d2845329d63f0922bb5d9a6",
      "value": 1
     }
    },
    "2aa32422748943759daf5ef05077bda0": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "2c83393c2b7745889765d8efb4890763": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "2cb4c1bff01b4f669ecd8583187bab9f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "348701c9256e4eb48b8ffb0d9c0d6c83": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "352af51e6e7943a7a41d3bbe41885d8d": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "37395cf0cac548c783ccbdac230c4a3c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_8085fe243d814d5da2b4d6b665a6aa51",
       "IPY_MODEL_0295736b3f254a8590d911792f2c19db",
       "IPY_MODEL_ad079ced956841be88a3ab6f2fdcd88d"
      ],
      "layout": "IPY_MODEL_953b16307b514bc995efc40ff8f4698b"
     }
    },
    "3838d1bfccb5402d91ecf96f51f9c2d7": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e732511315484861b39d0efb86b9cfb5",
      "placeholder": "​",
      "style": "IPY_MODEL_3df968e9ff654de7bfc95f08c88a99c6",
      "value": " 1/1 [00:00&lt;00:00, 33.52it/s]"
     }
    },
    "3df968e9ff654de7bfc95f08c88a99c6": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "3f1ba16f17c94fb8a409d152b9a6045a": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "43c8db4be4984f6da1540de6bc89b616": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_dc26c84713fb45f5a6c5b870c96d9d9e",
      "max": 1,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_a6ac9d7aed4c493db567b015ab8502a5",
      "value": 1
     }
    },
    "458bcab796d642c9afd2e534085b991f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_352af51e6e7943a7a41d3bbe41885d8d",
      "placeholder": "​",
      "style": "IPY_MODEL_2cb4c1bff01b4f669ecd8583187bab9f",
      "value": "Batches: 100%"
     }
    },
    "4d26773cf0ec45fc9ac3185f8141cfe6": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "4f4986d008434fc9912c496636b40b38": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "5a7b319329164b27bf452869e2335aef": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "5b3c84192618410ea1793239c4514c6e": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "5d09ef7e47f446a3a3a51458195a0fe3": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "608d1345487046ceb64b0b31a4287ae0": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_fce9aa1662c34941afadd6141aba9180",
      "placeholder": "​",
      "style": "IPY_MODEL_098016d32abc4f45be0a4f747cbc3f11",
      "value": "Batches: 100%"
     }
    },
    "66f8508878e94e4296e2ffb009afdb75": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "6854fe2978954c7b9e30202a6ea34b57": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "687d7bf7373f4541852203637e18d2e3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "6cb81ad9ee8141aa9d0fbefc276f244d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_80e18075a957476591fa1ba2585b7a73",
      "placeholder": "​",
      "style": "IPY_MODEL_e1d8ec56e5614d77a6999a42283be94b",
      "value": " 1/1 [00:00&lt;00:00, 27.76it/s]"
     }
    },
    "6f5389fdc3674a05ad79bb9456a5995f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e281ca37b72d422285aa64193265aaa4",
      "placeholder": "​",
      "style": "IPY_MODEL_687d7bf7373f4541852203637e18d2e3",
      "value": "Batches: 100%"
     }
    },
    "6f96c8a415744597bcaa83141b3a457c": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "70e45cb4f2f64c499acc785ec64743fe": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_d9f6781147a24bc3aec97b87927bdfbb",
      "placeholder": "​",
      "style": "IPY_MODEL_d0c85ebbf1a54fdcaa33210aa3e247b8",
      "value": " 620/620 [00:30&lt;00:00, 100.95it/s]"
     }
    },
    "7a5c511f2fe84c66beef7fed87023669": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_5a7b319329164b27bf452869e2335aef",
      "max": 620,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_e5a88639e7e5430fbe44f73d2e5a4b23",
      "value": 620
     }
    },
    "7ab68b0af00248f5bbc15a39bbf38166": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "7bd0527b8e174aec9911c5b32dc048fd": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "7c322a232739486a937883ac787f8750": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_11e5c44fa73c4d5d88561036f2a0a070",
      "placeholder": "​",
      "style": "IPY_MODEL_9781773e5d4d4e0ab8e3ff3140bd0983",
      "value": " 36/36 [00:16&lt;00:00,  5.64it/s]"
     }
    },
    "8085fe243d814d5da2b4d6b665a6aa51": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_4d26773cf0ec45fc9ac3185f8141cfe6",
      "placeholder": "​",
      "style": "IPY_MODEL_d7959d1933e5466095bed23bb268afd5",
      "value": "Iteration: 100%"
     }
    },
    "80e18075a957476591fa1ba2585b7a73": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "8396e1788d5540a79a9d195e2753351a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "85a67e7f5d2845329d63f0922bb5d9a6": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "8e41a0a7932b4f0b8a448847ff3f14ff": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "8e989ddf9d274876a3ba06056e7147a1": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "953b16307b514bc995efc40ff8f4698b": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "9781773e5d4d4e0ab8e3ff3140bd0983": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "999f219c7c9449f0a48feb59eddd23eb": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "9d726c5753564258bbe1c281fa8bfefa": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_66f8508878e94e4296e2ffb009afdb75",
      "placeholder": "​",
      "style": "IPY_MODEL_999f219c7c9449f0a48feb59eddd23eb",
      "value": "Batches: 100%"
     }
    },
    "a6ac9d7aed4c493db567b015ab8502a5": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "ad079ced956841be88a3ab6f2fdcd88d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_6f96c8a415744597bcaa83141b3a457c",
      "placeholder": "​",
      "style": "IPY_MODEL_8e41a0a7932b4f0b8a448847ff3f14ff",
      "value": " 1739/1739 [10:05&lt;00:00,  2.86it/s]"
     }
    },
    "b070922627a04195a41899a169984b08": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "b281e2a5a8204b52827f01316d637952": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_084ebc36eb9d4616acc1a0843673ac4f",
      "max": 1,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_252dfe4d46604a089c263bb0eae17a3a",
      "value": 1
     }
    },
    "b6ecc1cc5b2e4332b56fdc1614823d3e": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "b86aa89087cb425198afa2db30d86600": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "b9fbabd33a2a4d0a94055cd086d83228": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_168948926c2340abb8b52f8dd67a5e73",
      "placeholder": "​",
      "style": "IPY_MODEL_8396e1788d5540a79a9d195e2753351a",
      "value": "Epoch: 100%"
     }
    },
    "ba968ae891a2400fa0db9f331b85b66c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_5b3c84192618410ea1793239c4514c6e",
      "placeholder": "​",
      "style": "IPY_MODEL_7bd0527b8e174aec9911c5b32dc048fd",
      "value": " 1/1 [00:00&lt;00:00, 28.53it/s]"
     }
    },
    "bb260568c96a4397bba2b1058404eec2": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "c485139a148e4207957e96b4275eeed2": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "c7800a5a8f1b4c3fa541df6b5ba6281f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_9d726c5753564258bbe1c281fa8bfefa",
       "IPY_MODEL_ea3f511248734bbab197277b68346826",
       "IPY_MODEL_3838d1bfccb5402d91ecf96f51f9c2d7"
      ],
      "layout": "IPY_MODEL_ecc8ed6e869d4b01b7905ca951d0068c"
     }
    },
    "cdd38d9a948a4a4c8408dcb06d7c584a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_2aa32422748943759daf5ef05077bda0",
      "placeholder": "​",
      "style": "IPY_MODEL_e7c672eb19574b32811bdcc3f6ac0b34",
      "value": " 1/1 [11:44&lt;00:00, 704.92s/it]"
     }
    },
    "d0c85ebbf1a54fdcaa33210aa3e247b8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "d7959d1933e5466095bed23bb268afd5": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "d9f6781147a24bc3aec97b87927bdfbb": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "dbca2d7da970438892d45cd387434f6f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_6f5389fdc3674a05ad79bb9456a5995f",
       "IPY_MODEL_7a5c511f2fe84c66beef7fed87023669",
       "IPY_MODEL_70e45cb4f2f64c499acc785ec64743fe"
      ],
      "layout": "IPY_MODEL_bb260568c96a4397bba2b1058404eec2"
     }
    },
    "dc26c84713fb45f5a6c5b870c96d9d9e": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "e1d8ec56e5614d77a6999a42283be94b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "e281ca37b72d422285aa64193265aaa4": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "e31ae00bfabe4ed5b058d7dbe55a80f6": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_b9fbabd33a2a4d0a94055cd086d83228",
       "IPY_MODEL_b281e2a5a8204b52827f01316d637952",
       "IPY_MODEL_cdd38d9a948a4a4c8408dcb06d7c584a"
      ],
      "layout": "IPY_MODEL_b86aa89087cb425198afa2db30d86600"
     }
    },
    "e5a88639e7e5430fbe44f73d2e5a4b23": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "e732511315484861b39d0efb86b9cfb5": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "e7c672eb19574b32811bdcc3f6ac0b34": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "ea3f511248734bbab197277b68346826": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7ab68b0af00248f5bbc15a39bbf38166",
      "max": 1,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_b6ecc1cc5b2e4332b56fdc1614823d3e",
      "value": 1
     }
    },
    "ecc8ed6e869d4b01b7905ca951d0068c": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "f36d8f08f6284b848622fd560196cc78": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_608d1345487046ceb64b0b31a4287ae0",
       "IPY_MODEL_43c8db4be4984f6da1540de6bc89b616",
       "IPY_MODEL_6cb81ad9ee8141aa9d0fbefc276f244d"
      ],
      "layout": "IPY_MODEL_8e989ddf9d274876a3ba06056e7147a1"
     }
    },
    "f78b642ffb784f9097e0cbf97c44b9bd": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_4f4986d008434fc9912c496636b40b38",
      "max": 36,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_348701c9256e4eb48b8ffb0d9c0d6c83",
      "value": 36
     }
    },
    "fa6089718c574ee19bd3c378e356ea6b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_2c83393c2b7745889765d8efb4890763",
      "placeholder": "​",
      "style": "IPY_MODEL_6854fe2978954c7b9e30202a6ea34b57",
      "value": "Batches: 100%"
     }
    },
    "fce9aa1662c34941afadd6141aba9180": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
